我有这个打字稿代码(typescript playground):
const enum Something {
None = 0,
Email = 10,
All = 20
}
const enum Other{
Email = 10;
Value = 15;
}
interface Foo {
prop: Something
}
const value2: Something = Something.None;
// Why can 15 be assigned if it's not in the enum?
const value: Something = 15;
// This errors:
const otherValue: Something = 'asdf';
const value3: Something = Something.NotExists;
const value4: Something = Other.Value;
const value5: Something = Other.Email;
我不明白为什么15在这个例子中是可接受的值。 15不是enum的值,所以不应该抛出?
答案 0 :(得分:3)
这是(可能令人惊讶的)预期的行为。 TypeScript中的数字枚举有时用于按位运算,其中列出的值被视为flags。并且,正如@RyanCavanaugh comment reported issue对{{3}}所说的那样:
我们不区分标志枚举和非标志枚举,因此高于[或不等于]任何给定枚举成员的数字不一定无效。例如
enum Flags { Neat = 1, Cool = 2, Great = 4 } // like saying Neat | Cool | Great var x: Flags = 7;
因此即使7
不等于列出的Flags
枚举值中的任何一个,您仍然可以通过对列出的值执行按位运算来获取它。我非常确定编译器除了检查值是number
之外不会执行任何限制。
在您的情况下,即使Something
枚举值都不是15
,它也不会阻止您执行以下操作(无用和可疑的理智):
const value: Something = (Something.Email | Something.All) >> 1;
相同的内容(10 | 20
评估为30
,30 >> 1
为15
)。
请注意,这个按位的内容不适用于基于字符串的枚举,因此解决此问题的一种方法是将数字更改为字符串文字:
const enum Something {
None = '0',
Email = '10',
All = '20'
}
const value: Something = '15'; // error, as desired
并且编译器警告您'15'
不是Something
的有效值。
希望有所帮助。祝你好运!