打字稿在构造函数之外没有捕获`state`类型的错误?

时间:2017-05-23 20:12:22

标签: typescript typescript2.3

enter image description here

在上图中,我错误地设置了默认state值(this_is_not_ok不属于State界面)。不过,打字稿似乎并不介意。解决此问题的一种方法是显式添加类型注释。

我还可以使用constructor()

解决问题

constructor(){ super(); this.state = {spelling_error: "wrong"}; }

为什么类型推断在第一个例子中不起作用?

1 个答案:

答案 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