Digamos que tengo una clase base A y A1, A2, A3 todas se extienden a A. Creo una clase de fábrica, digamos, FactoryForA que implementa un método, digamos getObject como
getObject(typeToSwitch) { case A1: // return an object of A1 case A2: // return an object of A2 case A3: // return an object of A3 } Estoy buscando una manera de hacer que el tipo de argumento typeToSwitch seguro.
Mi enfoque sería usar la palabra clave infer typescript para devolver el tipo solicitado. Algo como lo siguiente:
class A { public getA = () => {} } class A1 extends A { constructor() { super(); } public getA = () => { return 'A1'; } } class A2 extends A { constructor() { super(); } public getA = () => { return 'A1'; } } // get the key map types ( a1 and a2 ) type Keys = keyof typeof FactoryA.AMap; // get the classes types type aTypes = typeof FactoryA.AMap[Keys]; // build the return type with generics type ClassInstanceType<T> = T extends new () => infer R ? R : never; class FactoryA { public static AMap = { a1: A1, a2: A2 }; public static getObject = (typeToSwitch: Keys ): ClassInstanceType<aTypes> => { return new FactoryA.AMap[typeToSwitch](); } } const a1instance: A1 = FactoryA.getObject('a1'); console.log(a1instance.getA());Lo que se me ocurrió es getObject<T extends new(...args: any[]) => A>(typeToSwitch: T) .
Dice que T es algo que extiende A y es construible, por lo que nos permite usar un tipo como valor (todavía tengo que entender por qué). Además getObject(T extends A) no funciona (por qué solo se admite un tipo construible).
Si alguien tiene sugerencias o explicaciones, actualice la respuesta o el comentario.
Aquí hay un enlace a un ejemplo de lo que dije anteriormente.