TypeScript:如何让子类知晓自身所属的父类实例类型?
问题:子类无法识别父类扩展后的类型属性
原代码中,BasicClass的children属性被固定为ChildClass[]类型,而ChildClass默认泛型指向BasicClass。当ExtendedClass继承BasicClass后,其子类实例的parent类型仍被推断为BasicClass,导致无法访问ExtendedClass独有的additional_data属性,报错如下:
const super_class = new SuperClass('Hello', ['123']) super_class.class.children[0].parent.additional_data // Property 'additional_data' does not exist on type 'BasicClass'.
解决方案:让BasicClass成为泛型类,传递自身类型给ChildClass
通过将BasicClass改造为泛型类,让它的子类(包括自身)能把实际类型传递给ChildClass,从而让ChildClass的parent类型自动匹配父类的真实类型。
修改后的完整代码
type BasicClassParams = { data: string children: string[] } // 定义泛型类,T约束为BasicClass<T>,代表当前类的实际类型 class BasicClass<T extends BasicClass<T>> { data: string children: ChildClass<T>[] // 使用泛型T指定ChildClass的父类类型 constructor(params: BasicClassParams) { this.data = params.data this.children = this.createChildren(params.children) } createChildren(children: string[]) { // 将this断言为T,确保传递给ChildClass的parent类型正确 return children.map(child => new ChildClass(child, this as T)) } } class ChildClass<T extends BasicClass<T>> { data: string parent: T constructor(data: string, parent: T) { this.data = data this.parent = parent } } // 扩展类时指定泛型为自身 type ExtendedClassParams = BasicClassParams & { additional_data: string } class ExtendedClass extends BasicClass<ExtendedClass> { additional_data: string constructor(params: ExtendedClassParams) { super(params) this.additional_data = params.additional_data } } class SuperClass { class: ExtendedClass constructor(data: string, children: string[]) { this.class = new ExtendedClass({ data, children, additional_data: 'Hello' }) } }
验证效果
此时执行以下代码,TypeScript将正确识别parent的类型为ExtendedClass,可直接访问additional_data:
const super_class = new SuperClass('Hello', ['123']) super_class.class.children[0].parent.additional_data // 类型校验通过,无报错
核心原理
- 泛型
T让BasicClass及其子类能自身类型传递给ChildClass,确保ChildClass的parent类型与父类实际类型一致。 createChildren中的this as T是安全的类型断言,帮助TypeScript正确推断当前类的具体类型,无需额外手动断言。
内容的提问来源于stack exchange,提问作者Andrew Rusinas
相关产品推荐
相关产品推荐

