我收到一个奇怪的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;
~~~~
为什么此代码会给出错误信息?
答案 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)