TypeScript错误:“类型'number'无法分配给类型'0 | 1 | 2'”。为什么会出现此错误?

时间:2019-05-28 16:26:46

标签: javascript typescript

我收到一个奇怪的TypeScript错误。

我有以下示例:

interface Foo {
  prop: 0 | 1 | 2;
}

class Bar implements Foo {
  prop = 1;
}

我得到了错误:

src/example.ts:6:3 - error TS2416: Property 'prop' in type 'Bar' is not assignable to the same property in base type 'Foo'.
  Type 'number' is not assignable to type '0 | 1 | 2'.

6   prop = 1;
    ~~~~

为什么此代码会给出错误信息?

3 个答案:

答案 0 :(得分:2)

在您的班级中,1被推断为加宽的number类型,因为推断可变标识符只能采用一个确切的初始值会很奇怪。在您的界面中,您没有在推断类型,而是在显式地注释它(不可避免)。

尝试强制转换prop = 1 as 1或注释prop : 1 | 2 | 3 = 1或使type oneThroughThree = 1 | 2 | 3;并使用该别名注释两个地方。最好的办法是,使用数字枚举覆盖可接受的范围,并且可能更具可读性。

答案 1 :(得分:0)

您还需要在Bar中定义元素,因为Foo是一个接口:

interface Foo {
  prop: 0 | 1 | 2;
}

class Bar implements Foo {
  prop: 0 | 1 | 2 = 1;
}

接口仅描述了类的外观,因此基本上,您需要重新定义类中的所有内容以匹配您的接口。

如果您不想重新定义元素的定义,则最好使用类:

class Foo {
  protected prop: 0 | 1 | 2;
}

class Bar extends Foo {
  public test() {
    this.prop = 1;
  }
}

答案 2 :(得分:0)

因为您已将prop分配为'0','1'或'2'类型,而不是可能的值0、1和2

正确的方法是创建一个可能值为0、1和2(例如,枚举值)的枚举类型变量,并分配prop以采用该枚举类型值(例如prop:values)

https://www.typescriptlang.org/docs/handbook/enums.html