如何为继承带generics抽象类A的类集合做TypeScript类型标注?
如何为存储继承带泛型类的对象做TypeScript类型标注
你当前的代码报错原因很明确:
A<any>是实例类型,但你存的是类本身(比如B是构造函数,不是实例),类型完全不匹配typeof A是抽象构造函数类型,而B是具体构造函数,TypeScript不允许把具体构造函数赋值给抽象构造函数类型
要实现“存储任何继承自A的类”的需求,你需要定义一个匹配所有A子类构造函数的类型,具体方案如下:
abstract class A<SOME_TYPE> { private something: SOME_TYPE; constructor(xxx: SOME_TYPE) { console.log(xxx); } } class B extends A<number> {} // 定义宽松版:匹配所有继承自A的类的构造函数,不限制参数 type AConstructor = new (...args: any[]) => A<any>; // 直接使用这个类型标注Record const listOfObjects: Record<string, AConstructor> = { b: B, // 无报错 }; // 如果需要更精确的构造参数匹配,可以用泛型构造签名 type AConstructorStrict = new <T>(arg: T) => A<T>; const listOfObjectsStrict: Record<string, AConstructorStrict> = { b: B, // 同样有效,B的构造函数符合该签名 };
如果你完全不关心构造函数的细节,也可以通过InstanceType反向推导构造函数类型:
type AConstructor = new (...args: any[]) => InstanceType<typeof A>;
核心逻辑就是:你要标注的是构造函数类型,而非实例类型,同时这个类型要兼容所有继承自A的具体类,不管它们的泛型参数是什么。
内容的提问来源于stack exchange,提问作者Jax-p
相关产品推荐
相关产品推荐

