TypeScript调用抽象类原型抽象方法未报错,如何触发错误?
TypeScript调用抽象类原型的抽象方法未报错,如何触发错误?
我定义了一个包含抽象方法的抽象类,发现使用prototype和call调用该抽象方法时,TypeScript不会抛出任何错误。示例代码如下:
abstract class Human{ age: string; constructor(age: string){ this.age = age; } abstract name(): void } class Human1 extends Human{ constructor(age: string){ super(age); this.name() } name(): void { Human.prototype.name.call(this); // 此处未触发错误,但name是抽象/未定义的 let a = "do something"; } } let a = new Human1("23")
原因分析
TypeScript对抽象类的类型校验核心是约束子类必须实现抽象方法,但对于直接访问抽象类原型上的抽象方法,当前类型系统没有做针对性的错误拦截。抽象类原型上的抽象方法仅作为类型声明存在,运行时实际是undefined,但TypeScript并未将这种调用判定为违规。
解决办法
- 开启TypeScript的
strict编译选项:虽然无法直接检测该场景,但严格模式会强化整体类型校验,减少此类不规范代码的出现。 - 自定义ESLint规则:编写ESLint规则扫描代码,识别
抽象类.prototype.抽象方法.call(this)这类调用,在编码阶段直接抛出错误提示。 - 重构代码:抽象方法的设计初衷是让子类提供具体实现,直接调用抽象类原型的方法违背了抽象类的设计意图,建议移除这类调用,改用子类自身的实现逻辑。
内容的提问来源于stack exchange,提问作者masinnlos
相关产品推荐
相关产品推荐

