Enums Typescript枚举开关不工作
我有下面的枚举Enums Typescript枚举开关不工作,enums,switch-statement,typescript,Enums,Switch Statement,Typescript,我有下面的枚举 enum EditMode { View = 0, Edit = 1, Delete = 2 } 假设我有一个枚举类型的变量 var editMode = EditMode.Edit; 为什么下面的代码不起作用(直接进入默认值) 我发现了我为什么会这样。代码中的某个地方有一个激活函数(我使用的是durandal),它将此枚举作为字符串传递(该函数将参数标记为枚举,但它仍然是字符串)。这就是我的switch语句失败的原因。我只是简单地将值转换为一个数字,
enum EditMode {
View = 0,
Edit = 1,
Delete = 2
}
假设我有一个枚举类型的变量
var editMode = EditMode.Edit;
为什么下面的代码不起作用(直接进入默认值)
我发现了我为什么会这样。代码中的某个地方有一个激活函数(我使用的是durandal),它将此枚举作为字符串传递(该函数将参数标记为枚举,但它仍然是字符串)。这就是我的switch语句失败的原因。我只是简单地将值转换为一个数字,现在一切正常。无论如何谢谢你我也有这个问题。绕过它的简单方法:在开关中的变量之前添加一个
+
符号,即
switch (+editMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
使用
const
声明枚举:
const enum EditMode {
View = 0,
Edit = 1,
Delete = 2
}
如果其他人在这里结束,而上面的选项似乎不是问题所在,请仔细检查您的所有switch语句是否正在中断/返回!Typescript编译器足够聪明,可以看到如果您的
案例
级联到另一个案例,您正在比较的值可能永远不会达到您预期的案例
let handlerName;
switch(method){
case 'create':
handlerName = 'createHandler';
break;
case 'update';
handlerName = 'updateHandler';
// Here is where the forgotten break would go
default:
throw new Error('Unrecognized Method');
}
switch(handlerName){
case 'createHandler':
...
break;
case 'updateHandler':
// You will see an error on this case because
// the compiler knows that execution will never
// arrive here with handler === 'updateHandler'
default:
throw new Error('Unrecognized Handler');
}
将EditMode枚举定义更改为:
enum EditMode {
View = "View",
Edit = "Edit",
Delete = "Delete"
}
Typescript 3.6.3如果在带有类型化参数的函数中使用
开关
表达式,这将按预期工作
例如:
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)
将编译这里的问题与typescript有关。执行此任务时:
var editMode=editMode.Edit
TypeScript将类型计算为:
var editMode:1=editMode.Edit
现在,当您将typescript知道必须是1
(EditMode.Edit
)的值与它知道必须是0
(EditMode.View
)的值进行比较时,它将所有这一切视为类型安全违规。如果变量editMode
不是enum
,typescript只会抱怨,但由于它是enum
,在javascript中并不存在,因此typescript控制传输的方式实际上会抛出错误所以你有两个选择。因此,您可以将
editMode
强制为number
或editMode
(即允许任何editMode
值,而不仅仅是分配给editMode
变量的值)就个人而言,我更喜欢强制它成为一个
编辑模式,因为它感觉更安全。
要走数字路线,您可以执行前面提到的以下操作:
开关(+editMode)
要使用EditMode
路径(我推荐),您可以将其传递给前面提到的函数,但有时不编写函数会更简洁。如果这里是这种情况,那么您可以再次强制开关中的类型
语句:
开关(editMode作为editMode)
做你喜欢做的任何事情,但我只是喜欢明确地说“这个变量被当作一个EditMode
”而不是“这个变量实际上应该是一个number
,而不是Enum
”类型脚本版本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;
}
在我的例子中,开关位于一个条件中,该条件将枚举强制为一个值:
enum A {
VAL_A,
VAL_B,
VAL_C
}
interface ia {
maybe?: A
}
const o: ia = {maybe: 0}
if(o.maybe){ //<-- o.maybe is not falsey (thus, is not 0)
switch(o.maybe) {
case A.VAL_A: //<-- Error! we know that o.maybe is not 0. Its VAL_B | VAL_C
break;
}
}
enum A{
瓦卢阿,
瓦卢,
瓦卢
}
接口ia{
也许吧
}
常数o:ia={maybe:0}
如果(o.maybe){/如果枚举是在单独的typescript文件中定义的,请确保该枚举标记为“导出”,并且在引用它的typescript文件的顶部正确导入它。像这样使用它
const enum OperationsType{
CREATE="CREATE",
DELETE="DELETE",
UPDATE="UPDATE"
}
使用/@ts ignore
suppress,您可以执行以下操作:
//@ts-ignore
switch (EditMode[editMode] as EditMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
}
此代码在TypeScript Played中工作。您确定您的脚本加载顺序正确吗?我也可以确认它在Played中工作。是的,问题似乎不是代码本身。出于某种原因,我的代码在枚举后面分配的不是数字,而是与数字相关联的字符串,例如istead 1(编辑)“1”。为什么我不明白。用if/else替换它,它应该可以工作。TypeScript中有一系列键入问题/功能。例如,这一个-实际上,这段代码在TypeScript操场中不起作用…editmode DELETE与editmode Edits不可比这也是我的问题。我的构造函数有一个Enum类型的参数,但有一个outside调用者正在传递字符串。我将构造函数参数更改为string类型,并使用EnumType[参数]将其转换为枚举。这似乎是修复typescript故障/错误的唯一方法。因此+将其更改为数字,这似乎有效。我认为这似乎不是一个很好的解决方案。我还尝试将枚举中的第一项指定为0,但没有任何帮助。似乎是一个错误。+是一个将其强制为数字的黑客。我下面的答案是根据现代的Typescript版本,它是正确的。这对我来说并不能解决它。没有加号(“+”)它就不能工作。它是如何解决这个问题的?
//@ts-ignore
switch (EditMode[editMode] as EditMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
}