TypeScript如何定义可识别子类属性的类型安全父类构造函数
你需要把泛型定义提升到父类的声明维度,子类继承时传入自身类型作为泛型参数即可实现类型安全的构造函数校验,完整实现如下:
完整可运行代码
// 父类声明为泛型类,约束泛型T必须继承自Parent本身 abstract class Parent<T extends Parent = Parent> { public foo: string; constructor(v: Partial<T>) { Object.assign(this, v); } } // 子类继承时传入自身作为泛型参数 class ChildA extends Parent<ChildA> { bar: string; } class ChildB extends Parent<ChildB> { baz: string; } // 实例化不会再报错,且支持类型校验 const a = new ChildA({ foo: 'foo', bar: 'bar'}); const b = new ChildB({ foo: 'foo', baz: 'baz'});
原报错原因说明
- 最初的父类构造函数仅接受
Partial<Parent>类型参数,仅能识别父类自身声明的foo属性,子类新增的bar/baz属性不在父类类型范围内,触发TS多余属性校验报错。 - TypeScript不支持给构造函数单独声明泛型参数,因此你尝试的
constructor<T extends Parent>写法会触发TS1092错误,泛型必须声明在类的维度。
可选:子类有自定义初始化逻辑的写法
如果子类需要写自己的构造函数做额外初始化,参考如下写法:
class ChildA extends Parent<ChildA> { bar: string; constructor(v: Partial<ChildA>) { // 先调用父类构造函数完成属性赋值 super(v); // 此处添加子类自定义初始化逻辑 this.bar = this.bar ?? '默认值'; } }
内容的提问来源于stack exchange,提问作者yskkin
相关产品推荐
相关产品推荐

