Typescript枚举开关无法正常工作

Man*_*zas 41 enums switch-statement typescript

我有以下枚举

enum EditMode {
    View = 0,
    Edit = 1,
    Delete = 2
}
Run Code Online (Sandbox Code Playgroud)

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

var editMode = EditMode.Edit;
Run Code Online (Sandbox Code Playgroud)

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

switch (editMode) {
    case EditMode.Delete:
        ...
        break;
    case EditMode.Edit:
        ...
        break;
    default:
        ...
        break;
    }
Run Code Online (Sandbox Code Playgroud)

Sha*_*ica 63

我也有这个问题.轻松绕过它:+在开关中的变量之前添加一个符号,即

switch (+editMode) {
    case EditMode.Delete:
        ...
        break;
    case EditMode.Edit:
        ...
        break;
    default:
        ...
        break;
    }
Run Code Online (Sandbox Code Playgroud)

  • 所以+会将它改成一个数字,这似乎有效.我认为这似乎不是一个很好的解决方案.我也尝试在我的枚举中将第一个项目指定为0,但它没有帮助.好像是一个bug. (13认同)
  • 这似乎是修复typescript故障/ bug的唯一方法. (2认同)
  • 感谢@nycynik,他解释了*为什么*这行得通 (2认同)

Man*_*zas 17

我找到了为什么我确实发生了.代码中的某个地方有一个激活函数(我正在使用durandal),它将此枚举作为一个字符串传递(该函数的参数标记为枚举但仍然是一个字符串).这就是我的switch语句失败的原因.我只是将值转换为数字,现在一切都按预期工作.不管怎么说,多谢拉

  • 这对我来说也是个问题.我的构造函数有一个Enum类型的参数,但外部调用者正在传递一个字符串.我将构造函数参数更改为string类型,并使用EnumType [parameter]将其转换为枚举. (2认同)

jav*_*301 15

将 EditMode 枚举定义更改为:

enum EditMode {
    View = "View",
    Edit = "Edit",
    Delete = "Delete"
}
Run Code Online (Sandbox Code Playgroud)


aca*_*cat 11

这里的问题与打字稿的(数字)文字类型有关。当你做这个任务时:

var editMode = EditMode.Edit
Run Code Online (Sandbox Code Playgroud)

TypeScript 将类型评估为:

var editMode: 1 = EditMode.Edit
Run Code Online (Sandbox Code Playgroud)

现在,当您将 typescript 知道必须1( EditMode.Edit) 的值与它知道必须0( EditMode.View)的值进行比较时,它会将所有这些都视为违反类型安全。如果变量editMode不是 an enum,typescript 只会抱怨,但由于它是 an enum,在 javascript 中并不真正存在,因此 typescript 会以实际上抛出错误的方式控制转译。
所以你有2个选择。因此,您可以强制editMode成为 anumber或成为 an EditMode(即EditMode允许任何值,而不仅仅是分配给editMode变量的值)。
就个人而言,我更愿意将其强制为EditMode,因为它感觉更类型安全。

要走号码路线,您可以执行以下操作,这是前面提到的:

switch(+editMode)
Run Code Online (Sandbox Code Playgroud)

要走这EditMode条路线(我推荐),您可以将其传递给前面提到的函数,但有时不编写函数会更简洁一些。如果是这种情况,那么您可以再次强制switch语句中的类型:

switch(editMode as EditMode)
Run Code Online (Sandbox Code Playgroud)

做你喜欢的任何事情,但我只是喜欢明确地说“这个变量被视为EditMode”而不是“这个变量实际上应该是一个number,而不是一个Enum”。


Ras*_*bal 8

打字稿版本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;
}
Run Code Online (Sandbox Code Playgroud)

视觉工作室代码:季节

或者您可以声明一个常量并用作 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;
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 如果没有加号('+'),它就不起作用。它怎么能解决问题呢? (3认同)