TypeScript继承抽象类实现抽象getter方法时出现类型不匹配问题
错误原因
报错的核心是你给Page1定义了和父类Page一致的泛型参数T extends typeof Base,但Page1的body getter返回值是固定绑定Content1的MyBody实例。TypeScript的类型校验要求泛型T要兼容所有满足extends typeof Base的可能类型(比如你定义的Content2),硬编码的Content1无法覆盖所有可能的T实例,所以触发了2416号报错。
解决方案
方案1:固定Page子类对应的Content类型(推荐,适配绝大多数业务场景)
如果每个Page子类只对应一种固定的Content类型,直接在继承父类时就把泛型写死,不需要给子类额外加泛型:
// 继承时直接指定父类泛型为typeof Content1,Page1不需要带泛型 class Page1 extends Page<typeof Content1> { get body () { return new MyBody(Content1); } } // 调用时类型自动推导正常 const p1 = new Page1("abc"); p1.body.content.content1; // 可正确识别content1属性,无报错
方案2:保留Page1的泛型动态能力
如果需要同一个Page子类支持传入不同的Content类型,就给子类加构造函数参数接收对应Content构造函数,不要硬编码:
class Page1<T extends typeof Base> extends Page<T> { // 新增参数接收传入的Content构造函数 constructor(inRoot: string, private contentCls: T) { super(inRoot); } get body () { return new MyBody(this.contentCls); } } // 使用时传入对应的Content构造函数即可 const p1 = new Page1("abc", Content1); p1.body.content.content1; // 类型推导正常
补充说明
你写的非抽象类NotAbstractedPage没有声明泛型参数,TypeScript会直接推导它的body返回类型为MyBody<typeof Content1>,不存在泛型兼容问题,所以能正常运行。
内容的提问来源于stack exchange,提问作者A. L
相关产品推荐
相关产品推荐

