TypeScript抽象类方法返回类型能否被子类自动推断无需强转?
结论
可以实现无需手动类型转换,让TypeScript自动推断子类getData()的返回值类型,有两种常用实现方案:
方案1:使用索引类型查询绑定实例属性类型(最简便)
直接将父类getData的返回值声明为this['data'],该语法会自动关联当前实例的data属性类型,不需要额外修改子类代码:
// Parent.ts 改造后代码 abstract class Parent<T> { abstract data: T | T[]; // 用this['data']绑定返回值和当前实例的data属性类型 getData(): this['data'] { return this.data; } }
// Child.ts 无需修改 class Child extends Parent<Person> { data: Person[] = []; }
// index.ts 调用时自动推断为Person[]类型 const child = new Child(); child.getData() // 类型为Person[],无需强转
方案2:扩展父类泛型参数显式声明data类型
适合需要在父层对data类型做额外约束的场景,给抽象类新增第二个泛型参数,专门指定data的具体类型:
// Parent.ts 改造后代码 // 第二个泛型D给了默认值,不影响原有其他子类的继承逻辑 abstract class Parent<T, D extends T | T[] = T | T[]> { abstract data: D; getData(): D { return this.data; } }
// Child.ts 继承时传入data的具体类型即可 class Child extends Parent<Person, Person[]> { data: Person[] = []; }
// index.ts 调用时自动推断为Person[]类型 const child = new Child(); child.getData() // 类型为Person[],无需强转
内容的提问来源于stack exchange,提问作者Anthony Ma
相关产品推荐
相关产品推荐

