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;
    }
}