TypeScript检查JS文件时,子类引用父类属性出现隐式any类型报错
问题原因与解决方案
TypeScript在检查JavaScript文件时,对于父类中仅通过构造函数赋值的属性,默认不会自动为子类中的this.a推断类型——这是因为JavaScript没有显式的类属性声明语法,TypeScript无法自动追溯父类构造函数里的赋值逻辑来确定子类继承属性的类型。而当前类中定义的属性能被识别,是因为TS可以直接从当前类的赋值表达式里推断出类型。
解决办法
方法一:在父类中用JSDoc显式声明属性类型
可以在父类的类级JSDoc里声明属性类型,或者在构造函数内给this.a添加类型注释:
类级JSDoc声明
/** * @class * @property {number} a - 存储数字的属性 */ class Foo { /** * @param {number} a */ constructor(a) { this.a = a; } }
构造函数内注释
class Foo { /** * @param {number} a */ constructor(a) { /** @type {number} */ this.a = a; } }
方法二:在子类中显式标注属性类型
如果不想修改父类,也可以在子类里用JSDoc给this.a补全类型:
class Bar extends Foo { constructor() { super(5); /** @type {number} */ this.a; } move() { const foo = this.a + 5; this.a = foo; } }
这样TypeScript就能正确识别this.a的number类型,消除隐式any的报错。
内容的提问来源于stack exchange,提问作者Evert
相关产品推荐
相关产品推荐

