我有以下枚举
enum EditMode {
View = 0,
Edit = 1,
Delete = 2
}
假设我有一个枚举类型的变量
var editMode = EditMode.Edit;
为什么以下代码不起作用(直接默认)?
switch (editMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
答案 0 :(得分:53)
我也有这个问题。简单的解决方法:在交换机中的变量之前添加+
符号,即
switch (+editMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
答案 1 :(得分:15)
我找到了为什么我确实发生了。代码中的某处有一个激活函数(我正在使用durandal),它将此枚举作为一个字符串传递(该函数的参数标记为枚举但仍然是一个字符串)。这就是我的switch语句失败的原因。我只是将值转换为数字,现在一切都按预期工作。非常感谢
答案 2 :(得分:7)
这里的问题与打字稿的(numeric) literal types有关。当您执行此作业时:
var editMode = EditMode.Edit
TypeScript将类型评估为:
var editMode: 1 = EditMode.Edit
现在,当您将打字稿知道必须为1
(EditMode.Edit
的值与它知道必须为{ {1}}(0
),将其视为类型安全违规。如果变量EditMode.View
不是editMode
,则打字稿只会抱怨,但由于它是enum
(实际上在javascript中并不存在),打字稿可以控制此类脚本的翻译一种实际上引发错误的方式。
因此,您有2个选择。因此,您可以强制enum
成为editMode
或成为number
(即,允许将任何值EditMode
设为EditMode
,而不仅仅是分配给{ {1}}变量)。
就我个人而言,我更倾向于将其强制为editMode
,因为它具有更好的类型安全性。
要进行号码路由,您可以执行前面提到的以下操作:
EditMode
要走switch(+editMode)
路线(我建议这样做),您可以按照前面提到的那样将其传递给函数,但是有时候不编写函数会更干净一些。如果是这种情况,那么您可以再次在EditMode
语句中强制类型:
switch
做任何您喜欢的事情,但我只想清楚地明确地说“该变量被视为switch(editMode as EditMode)
”,而不是“该变量实际上应该是EditMode
”, number
”。
答案 3 :(得分:5)
TypeScript版本 3.7.5
此代码对我有用
enum Seasons {
Winter,
Spring,
Summer,
Autum
}
switch (+Seasons.Winter) {
case Seasons.Winter:
console.log('weather is cold');
break;
case Seasons.Spring:
console.log('weather is spring');
break;
case Seasons.Summer:
console.log('weather is summer');
break;
default:
break;
}
或者您可以声明一个常量并将其用作switch语句的参数
const season: Seasons = Seasons.Winter
switch (+season) {
case Seasons.Winter:
console.log('weather is cold');
break;
case Seasons.Spring:
console.log('weather is spring');
break;
case Seasons.Summer:
console.log('weather is summer');
break;
default:
break;
}
答案 4 :(得分:1)
万一其他人到了这里并且上述选项似乎不是问题,请仔细检查您所有的switch语句是否都在中断/返回! Typescript编译器足够聪明,可以看到如果您的AppTheme
级联到另一个,那么您所比较的值可能永远不会达到您期望的情况。
case
答案 5 :(得分:0)
使用const
声明您的枚举:
const enum EditMode {
View = 0,
Edit = 1,
Delete = 2
}
答案 6 :(得分:0)
将您的EditMode枚举定义更改为:
enum EditMode {
View = "View",
Edit = "Edit",
Delete = "Delete"
}
打字稿3.6.3
答案 7 :(得分:0)
如果您在带有类型化参数的函数中使用switch
表达式,则可以按预期工作。
示例:
enum EditMode {
View,
Edit,
Delete,
}
function testSwitch(editMode: EditMode) {
switch(editMode) {
case EditMode.Delete:
console.log("delete");
break;
case EditMode.Edit:
console.log("edit");
break;
default:
console.log("default");
break;
}
}
testSwitch(EditMode.Edit)
将编译?并输出edit
?
答案 8 :(得分:0)
在我的情况下,我将开关置于条件内,该条件将枚举强制为一个值:
branch3x3
答案 9 :(得分:0)
如果枚举是在单独的打字稿文件中定义的,请确保将其标记为“导出”,并确保将其正确导入到引用它的打字稿文件的顶部。
答案 10 :(得分:0)
像这样使用它。
const enum OperationsType{
CREATE="CREATE",
DELETE="DELETE",
UPDATE="UPDATE"
}
答案 11 :(得分:0)
使用//@ts-ignore
压制您可以执行以下操作:
//@ts-ignore
switch (EditMode[editMode] as EditMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
}