Me gustaría pasar un genérico para poder escribir previamente mi clase devuelta.
public createVehicle<O extends AbstractVehicle>( type: string ): O { switch (type) { case "Car": return new Car(param1, param2); case OfferType.Sale: return new Bike(param3, param4) default: throw new Error("Vehicle type not supported"); } }sin embargo esto me da:
Type 'Car' is not assignable to type 'O'. 'Car' is assignable to the constraint of type 'O', but 'O' could be instantiated with a different subtype of constraint 'AbstractVehicle' lo cual entiendo, ya que puede ser algo como AbstractVehicle & {} , pero ¿no debería ser algo fácil de hacer?
Intenté durante horas sin solución, sigue arrojando ese error. ¿Alguna sugerencia para mantener esto simple y legible?
Su función no es genérica sobre su tipo de retorno. solo debes escribir
createVehicle(type: string): Car | Bikeo
createVehicle(type: string): AbstractVehicle y llámelo como createVehicle("Car") as Car not createVehicle<Car>("Car") .
En todo caso, su función es genérica sobre su tipo de argumento, y puede inferir el tipo de retorno de eso:
public createVehicle<T extends "Car" | "Bike">(type: T): T extends "Car" ? Car : T extends "Bike" ? Bike : never Esto inferirá el tipo de resultado correcto para la llamada createVehicle("Car") (es decir typeof createVehicle<"Car">("Car") = Car ), pero para createVehicle(unknownType) seguirá infiriendo la unión.