作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个字符串枚举,它是另一个字符串枚举值的子集。我正在尝试对前者进行详尽的切换案例。
这是我试图在 Typescript 中表示的构造的一个人为示例
const enum Color {
BLUE = 'Blue',
YELLOW = 'Yellow',
RED = 'Red'
}
const enum SupportedColor {
BLUE = Color.BLUE,
YELLOW = Color.YELLOW
}
function doSomething(colorFromOutsideInput: string): boolean {
const supportedColor: SupportedColor = (colorFromOutsideInput as unknown) as SupportedColor;
switch (supportedColor) {
case SupportedColor.BLUE:
return true;
case SupportedColor.YELLOW:
return true;
default:
return invalidColor(supportedColor);
}
}
function invalidColor(supportedColor: never): never {
throw new Error();
}
Argument of type 'SupportedColor' is not assignable to parameter of type 'never'.
Color
上做这个开关案例枚举而不是
SupportedColor
枚举,它会起作用。
最佳答案
我会尽量减少这个例子,但提出的问题是一样的。
枚举,其中每个枚举值都具有显式 string literal或 numeric literal输入像 union types , 可以通过 type guards 缩小.这种枚举称为 union enum :
// union enum
const enum SupportedColor {
BLUE = "Blue",
YELLOW = "Yellow"
}
// no error here
function doSomething(supportedColor: SupportedColor): boolean {
switch (supportedColor) {
case SupportedColor.BLUE:
supportedColor // SupportedColor.BLUE
return true;
case SupportedColor.YELLOW:
supportedColor // SupportedColor.YELLOW
return true;
}
//supportedColor // never
//~~~~~~~~~~~~~ <-- unreachable code
}
switch
声明是详尽无遗的,因为
supportedColor
类型
SupportedColor
可以通过控制流分析来缩小。型号
SupportedColor
相当于联合
SupportedColor.BLUE | SupportedColor.YELLOW
.
case
s,
supportedColor
依次缩小到类型
SupportedColor.BLUE
和
SupportedColor.YELLOW
.后
switch
语句结束,编译器知道
supportedColor
类型为
never
, 因为两者都是
SupportedColor.BLUE
和
SupportedColor.YELLOW
已经被联盟过滤掉了。如果您取消注释
switch
之后的代码块,编译器甚至会提示它在 TS3.7+ 中无法访问。
const enum Color {
BLUE = 'Blue',
YELLOW = 'Yellow',
RED = 'Red'
}
// calculated enum
const enum SupportedColor {
BLUE = Color.BLUE,
YELLOW = Color.YELLOW
}
function doSomething(supportedColor: SupportedColor): boolean { // error!
// --------------------------------------------> ~~~~~~~
// function lacks ending return statement
switch (supportedColor) {
case SupportedColor.BLUE:
supportedColor // SupportedColor
return true;
case SupportedColor.YELLOW:
supportedColor // SupportedColor
return true;
}
supportedColor // SupportedColor
}
SupportedColor
不再被视为联合类型。计算的枚举不是联合枚举。因此编译器无法缩小或过滤
supportedColor
的类型。在
switch
中或之后陈述。类型保持
SupportedColor
整个过程。和
switch
语句不被视为详尽无遗,并且编译器提示该函数并不总是返回一个值。
- There are actually many kinds of enums under the hood
- Union enums only get created when only bare literals (or nothing) are initializers
- These kinds of enums behave differently
- You might want one or the other and this is how you choose
- Working As Intended; would be a Breaking Change
关于typescript - 您如何使用引用其他字符串枚举的字符串枚举在 Typescript 中进行详尽的 switch case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60610859/
我是一名优秀的程序员,十分优秀!