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

如何实现可接收子类属性对象的泛型父类构造函数?

解决TypeScript基类构造函数无法引用this类型的问题

你想要实现一个基类,其构造函数能接收包含子类所有属性的对象,但TypeScript不允许在构造函数参数类型中引用typeof this,导致报错。以下是两种可行的实现方案:

方案1:利用构造函数的this参数自动推断子类类型

通过构造函数的this参数捕获子类类型,结合泛型实现类型安全的props参数,无需子类显式声明泛型:

class BaseClass {
  constructor<T extends BaseClass>(this: T, props: Partial<T>) {
    Object.assign(this, props);
  }
}

class User extends BaseClass {
  name!: string;
  age!: number;
}

const user = new User({ name: "John" }); // 类型校验通过,age属性可选

关键细节:

  • 构造函数中的this: T是TypeScript专属语法,用于指定构造函数调用时this的实际类型,此处T会被自动推断为子类(如User)的类型。
  • Partial<T>将子类的所有属性设为可选,完美匹配你希望props可传入部分属性的需求。
  • 子类属性需用!(非空断言)标记,因为TypeScript无法自动识别Object.assign会为这些属性赋值,该断言用于告知编译器实例化后属性必定存在。

方案2:泛型基类显式绑定子类类型

如果偏好显式的泛型声明关系,可给基类添加泛型参数并约束为自身子类:

class BaseClass<SubClass extends BaseClass<SubClass>> {
  constructor(props: Partial<SubClass>) {
    Object.assign(this, props);
  }
}

class User extends BaseClass<User> {
  name!: string;
  age!: number;
}

const user = new User({ name: "John" }); // 同样满足类型安全要求

关键细节:

  • 泛型约束SubClass extends BaseClass<SubClass>确保泛型参数必须是BaseClass的子类,避免非法类型传入。
  • 子类继承时需显式指定泛型参数为自身(BaseClass<User>),让基类的props类型对应Partial<User>。

原代码报错原因

TypeScript类型系统禁止在构造函数的参数类型中引用typeof this,因为构造函数执行阶段this的类型尚未完全确定,这是语言设计层面的限制,因此必须通过泛型或this参数的方式间接获取子类类型。

内容的提问来源于stack exchange,提问作者Robin De Schepper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:55:19