我正在使用Typescript检查我的Javascript文件。当我从一个类扩展时,Typescript不再知道父类中属性的类型。我很好奇我是否遗漏了一些明显的东西,或者Typescript只是不支持检查:
class Foo {
/**
* @param {number} a
*/
constructor(a) {
this.a = a;
}
}
class Bar extends Foo {
constructor() {
super(5);
}
move() {
const foo = this.a + 5;
this.a = foo;
}
}
错误:
'foo' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
'a' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
我希望Typescript能够理解this.a
具有number
类型,因为当属性在当前类(而不是父类)中定义时,它 * 确实 * 理解这一点
2条答案
按热度按时间mklgxw1f1#
我希望TypeScript能够理解this. a具有类型号
你所期待的东西叫做“类型推断”,TypeScript在推断类型方面非常聪明,但是当类型在源代码中不明显时,它就不能推断类型。
例如,TS可以确定性地推断
a
在这里是number
。但是,在这里不能确定地推断
a
是number
。医生评论,
不是标准的TypeScript,因此这对您没有任何帮助。
yftpprvb2#
在
Bar
的move
方法中,有一个循环类型推断:您将Bar.a
设置为值foo
,该值是使用Bar.a
计算的,没有显式注解-因此出现错误:...隐式具有类型“any”,因为它没有类型注解,并且在其自己的初始值设定项中直接或间接引用。(7022)
以下是三种解决方案:
1.防止不必要的推断-不要使用中间变量:
TSPlayground
1.显式注解(强制转换)
foo
的类型:TSPlayground
1.从
this
(Bar
)获取值,但将值设置为super
(Foo
)-并维护离散推理站点:TSPlayground
对
Bar
示例上的属性a
的访问仍将从prototype属性解析。