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

如何创建泛型更具体的子类并解决静态方法返回类型问题

解决方案

问题1:静态方法返回子类实例

TypeScript默认无法自动推断静态方法中new this()的具体类型,需通过显式指定this参数的构造函数类型,让编译器识别当前调用类的实例类型。

修改Base类的create方法:

class Base<T extends BaseOptions> {
  options: T;

  constructor(options: T) {
    this.options = options;
  }

  // 添加this参数指定构造函数签名,返回当前类的实例
  static create<T extends BaseOptions>(
    this: new (options: T) => Base<T>, 
    options: T
  ): InstanceType<typeof this> {
    return new this(options);
  }
}

此时子类调用create时,TypeScript会自动推断返回子类实例,无需额外重写方法。

问题2:子类使用更具体的泛型约束

子类无需重写create方法,继承自父类的方法会自动根据子类的泛型约束进行类型校验,直接定义子类即可:

class Sub<T extends SubOptions> extends Base<T> {
  // 无需重写create,继承的方法会自动约束options为SubOptions类型,返回Sub<T>实例
}

验证示例

// 返回Base<BaseOptions>实例,仅需传入a属性
const baseInstance = Base.create({ a: "base" });

// 返回Sub<SubOptions>实例,必须传入a和b属性
const subInstance = Sub.create({ a: "sub", b: "sub-option" });

若必须重写子类的create方法

如果业务需要重写子类静态方法,需保证参数类型符合里氏替换原则,可通过类型断言实现:

class Sub<T extends SubOptions> extends Base<T> {
  static override create<T extends SubOptions>(options: T): Sub<T> {
    // 用类型断言告知编译器当前this指向Sub构造函数
    return new (this as typeof Sub<T>)(options);
  }
}

内容的提问来源于stack exchange,提问作者sudoremo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:20:23