gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:18 26 4
gpt4 key购买 nike

我有这个 typescript 代码(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 不是枚举的值,所以它不应该抛出吗?

最佳答案

(2021-06-10 更新,the TS4.3 update for union enums 未更改)

这是(可能令人惊讶的)预期行为。 TypeScript 中的数字枚举有时用于按位运算,其中列出的值被视为 flags .并且,如 @RyanCavanaugh 所述在commentreported issue 上关于这个:

We don't distinguish between flag and non-flag enums, so a number that is above [or not equal to] any given enum member isn't necessarily invalid. For example

枚举标志 {
整洁 = 1,
酷= 2,
很棒 = 4
}
//就像说 Neat |酷 |伟大的
var x: 标志 = 7;

因此,即使 7 不等于列出的任何一个 Flags 枚举值,您仍然可以通过对列出的值执行按位运算来获取它。我很确定编译器除了检查该值是否为 number 外,不会执行任何限制。

在你的情况下,即使 Something 枚举值都不是 15,它也不会阻止你执行以下(无用且可疑的理智):

const value: Something = (Something.Email | Something.All) >> 1;

这相当于同一件事(10 | 20 的计算结果为 30,而 30 >> 115).


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

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

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

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

关于typescript - 使用枚举作为类型允许枚举中不存在的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49190137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com