在上图中,我错误地设置了默认state
值(this_is_not_ok
不属于State
界面)。不过,打字稿似乎并不介意。解决此问题的一种方法是显式添加类型注释。
我还可以使用constructor()
:
constructor(){
super();
this.state = {spelling_error: "wrong"};
}
为什么类型推断在第一个例子中不起作用?
答案 0 :(得分:8)
我错误地设置了默认状态值
您尚未正确设置值。您只需编写一个具有比基类更多状态的类,这不是错误本身。编写派生类时,可以拥有比基类更多的东西。
当您编写没有类型注释的类属性初始值设定项时,TypeScript会根据初始值设定项推断属性的类型:
interface Bar {
stuff: { x: number }
}
class Foo implements Bar {
stuff = {
x: 10, y: 3
}
}
const f = new Foo();
console.log(f.stuff.y); // OK: f.stuff is of type { x: number; y: number; }
implements
检查仅表示"确保此类可用作作为接口类型"。派生类也会发生同样的事情:因为你有至少基类合同规定的东西,那么一切都很好。
如果你有一个显式的类型注释,或者在构造函数中进行初始化,那么适用于分配对象文字的一般规则 - 不允许额外的属性。
对于它的价值,这种行为可能会在将来的TypeScript版本中发生变化。见https://github.com/Microsoft/TypeScript/issues/10570