使用枚举作为类型允许枚举中不存在的值

时间:2018-03-09 09:07:50

标签: typescript enums

我有这个打字稿代码(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的值,所以不应该抛出?

1 个答案:

答案 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评估为3030 >> 115)。

请注意,这个按位的内容不适用于基于字符串的枚举,因此解决此问题的一种方法是将数字更改为字符串文字:

const enum Something {
  None = '0',
  Email = '10',
  All = '20'
}
const value: Something = '15'; // error, as desired

并且编译器警告您'15'不是Something的有效值。

希望有所帮助。祝你好运!