在打字稿中打开工厂中的类型

Switching on types in a factory in typescipt

假设我有一个基础 class AA1, A2, A3 都扩展了 A。我创建了一个工厂 class 说 FactoryForA 实现了一个方法说 getObject

getObject(typeToSwitch) {
  case A1: // return an  object of A1
  case A2: // return an object of A2
  case A3: // return an object of A3
}

我正在寻找一种使参数 typeToSwitch 类型安全的方法。

我想到的是getObject<T extends new(...args: any[]) => A>(typeToSwitch: T)

它说 T 是扩展 A 的东西并且是可构造的,所以它允许我们使用类型作为值(我还没有弄清楚这是为什么)。 getObject(T extends A) 也不起作用(为什么只支持可构造类型。)

如果有人有任何建议或解释,请更新答案或评论。

Here 是我上面所说的一个例子 link。

我的方法是使用 infer 打字稿关键字 return 请求的类型。类似下面的内容:

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());