作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果你有一个常量列表或枚举,你该怎么做?
这是伪示例代码:
enum MyList
{
A,
B
}
enum MyList2
{
C
}
function test<T>(input:MyList | T):void
{
}
test<MyList2>(123) // compiler does not identify that 123 is not a supported
最佳答案
这是一个 longstanding issue与数字枚举。无论出于何种原因(某些无法破坏的向后兼容性),number
都被视为可分配给数字枚举,因此您可以毫无错误地执行此操作:
enum E {
V = 100
}
const num = 100;
const e: E = num; // no error 🤔
此外,数字枚举也用于 act as bit fields ,因此他们有意不要求数字枚举类型的值是特定声明值之一:
enum Color {
RED = 1,
GREEN = 2,
BLUE = 4
}
const red: Color = Color.RED; // 1
const yellow: Color = Color.RED | Color.GREEN; // 3 🤔
const white: Color = Color.RED | Color.GREEN | Color.BLUE; // 7 🤔
const octarine: Color = Math.pow(Color.BLUE - Color.RED, Color.GREEN); // 9 🤪
是的,我不知道为什么你可以用数字枚举做任何你想做的数学,但你可以。结果是,基本上任何 number
都可以分配给任何数字枚举,反之亦然。
如果你想避免这种情况,你可能想放弃实际的枚举,而是用你控制的行为来创建你自己的类型和值。它更冗长,但可能会满足您的需求:
const MyList = {
A: 0,
B: 1
} as const;
type MyList = typeof MyList[keyof typeof MyList]
const MyList2 = {
C: 0
} as const;
type MyList2 = typeof MyList2[keyof typeof MyList2]
它们的行为与您的旧枚举类似(尽管缺少一些类型),但它们的行为会更加严格:
function test<T>(input: MyList | T): void {}
test(0); // okay
test(1); // okay
test(2); // okay, 2 is inferred as T
test<MyList2>(123); // error! 123 is not assignable to 0 | 1
好的,希望对你有帮助。祝你好运!
关于 typescript 扩展枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56992173/
我是一名优秀的程序员,十分优秀!