You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为继承带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:31:07