在打字稿中打开工厂中的类型
Switching on types in a factory in typescipt
假设我有一个基础 class A
和 A1, 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());
假设我有一个基础 class A
和 A1, 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());