我正在尝试使用enum作为接口描述中的值。 TypeScript可以理解键入内容,但是无法检查对象:
enum Type {
A = 'a',
B = 'b',
C = 'C'
}
interface ABC {
type: Type
}
interface A extends ABC {
type: Type.A
}
const a: A = { type: 'a' }
// Type '{ type: "a"; }' is not assignable to type 'A'.
// Types of property 'type' are incompatible.
// Type '"a"' is not assignable to type 'Type.A'.
尽管,当我直接设置枚举const a : A = { type: Type.A }
或使用字符串作为值时,它会按预期工作:
interface A {
type: 'a'
}
const a: A = { type: 'a' }
答案 0 :(得分:2)
这是预期的和预期的行为。有关讨论,请参见this ticket。其要点是,您不应尝试对枚举值进行硬编码,因为枚举值是专门设计用来隐藏基础常量的。
在不需要分配字符串文字但可以使用枚举的情况下,执行此操作的正确方法是:
enum Type {
A = 'a',
B = 'b',
C = 'C'
}
interface ABC {
type: Type
}
interface A extends ABC {
type: Type.A
}
const a: A = { type: Type.A }
总是有使用类型转换let a: A = {type: "a" as Type.A};
的选项,但是如果这样做,将不会获得类型安全性。我会坚持第一种模式,如果您有任何用户提供的值,则由于类型检查仅是编译时,因此无论如何都需要检查该值(我是否会验证它是否确实是'a')。
let a: A;
if (userValue === Type.A) {
a = { type: userValue };
}