【发布时间】:2019-02-23 07:02:42
【问题描述】:
当在接口中定义字符串字面量类型时,我得到了意想不到的行为。
interface IFoo {
value: 'foo' | 'boo';
}
当我在类中实现接口时出现错误:
class Foo implements IFoo {
value = 'foo';
}
我收到一个错误:“Foo”类型中的属性“值”不能分配给基类型“IFoo”中的相同属性。但 'foo' 是字符串文字的正确值。
另一方面:
class Boo implements IFoo {
value;
constructor() {
this.value = 'foo';
this.value = 'boo';
this.value = 'koo'; // must be an error Boo doesn't implement IFoo
}
}
const test = new Boo();
test.value = 'koo';
此代码不会导致任何错误,但Boo.value 属于any 类型。我预计会收到 Boo 未实现 IFoo 的错误,但没有任何错误。
我发现唯一正确的方法是这样实现类:
class Koo implements IFoo {
value: 'foo' | 'boo' = 'foo';
}
所以我不得不声明枚举:
enum Doos { foo = 'foo', boo = 'boo' }
interface IDoo {
value: Doos;
}
class Doo implements IDoo {
value = Doos.foo;
}
const test = new Doo();
test.value = Doos.boo;
我理解这是因为 ts 编译器从字段声明中的分配值中获取了 Doo.value 类型。看起来在接口中声明字符串文字类型的字段没有用,或者我做错了什么。并且还发现类可以实现任何字段类型的接口,所以这取决于开发人员。
【问题讨论】:
标签: typescript typescript-types