Typescript 使用枚举作为类型允许不使用';不存在于枚举中

Typescript 使用枚举作为类型允许不使用';不存在于枚举中,typescript,enums,Typescript,Enums,我有这个类型脚本代码(): 我不明白为什么15在这种情况下是一个可接受的值。15不是枚举的值,所以它不应该抛出吗?(更新2021-06-10,此值由保持不变) 这是(可能令人惊讶的)预期行为。TypeScript中的数字枚举有时用于按位操作,其中列出的值被视为。并且,如a中所述,关于这一点: 我们不区分标志和非标志枚举,因此高于[或不等于]任何给定枚举成员的数字不一定无效。比如说 enum标志{ 整洁=1, 酷=2, 好的=4 } //喜欢说整洁、酷、棒 变量x:Flags=7 因此,即使7不等

我有这个类型脚本代码():

我不明白为什么15在这种情况下是一个可接受的值。15不是枚举的值,所以它不应该抛出吗?

(更新2021-06-10,此值由保持不变)

这是(可能令人惊讶的)预期行为。TypeScript中的数字枚举有时用于按位操作,其中列出的值被视为。并且,如a中所述,关于这一点:

我们不区分标志和非标志枚举,因此高于[或不等于]任何给定枚举成员的数字不一定无效。比如说

enum标志{
整洁=1,
酷=2,
好的=4
}
//喜欢说整洁、酷、棒
变量x:Flags=7

因此,即使
7
不等于列出的
标志
枚举值中的任何一个,您仍然可以通过对列出的值执行位操作来获得它。我很确定编译器除了检查值是否为
数字
之外,不会做任何限制

在您的情况下,即使没有一个
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'
不是
某物的有效值


希望有帮助。祝你好运

检查这个答案:我相信这里已经回答了这个问题:
const enum Something {
  None = '0',
  Email = '10',
  All = '20'
}
const value: Something = '15'; // error, as desired