Typescript枚举开关无法正常工作

时间:2015-01-02 19:22:53

标签: enums switch-statement typescript

我有以下枚举

enum EditMode {
    View = 0,
    Edit = 1,
    Delete = 2
}

假设我有一个枚举类型的变量

var editMode = EditMode.Edit;

为什么以下代码不起作用(直接默认)?

switch (editMode) {
    case EditMode.Delete:
        ...
        break;
    case EditMode.Edit:
        ...
        break;
    default:
        ...
        break;
    }

12 个答案:

答案 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

现在,当您将打字稿知道必须1EditMode.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;
}

visual studio code: seasons

或者您可以声明一个常量并将其用作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;
}

enter image description here

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