【问题标题】:TypeScript enum switch statement without break没有中断的 TypeScript 枚举 switch 语句
【发布时间】:2021-07-11 07:08:57
【问题描述】:

如果我理解正确,以下签名的 switch 语句执行:

switch (key) {
    case value:

        break;
    default:

        break;
}

如下:

  • 如果大小写值匹配键
    • 在里面执行代码
    • 如果发现返回或中断
      • 退出开关
    • 否则评估下一个案例
  • 否则评估下一个案例

因为当我省略 break 时 TypeScript 不会报错,所以我假设 switch 语句的工作方式类似于 if 语句;如果条件为真,就会执行 if 语句中的代码。

但如果我省略了中断,下面的示例代码将打印出所有 3 个案例,即使这些案例并不都是真的。

enum SomeEnum {
    a = 'a',
    b = 'b',
    c = 'c',
}

doSomething(SomeEnum.a)

function doSomething(s: SomeEnum) {
    switch (s) {
        case SomeEnum.a:
            console.log(1)
            break
        case SomeEnum.b:
            console.log(2)
            break
        case SomeEnum.c:
            console.log(3)
            break
        default:
            break
    }
}

所以,我想我在这里误解了一些东西,但是搜索这个问题并没有产生任何结果。如果有人能对此有所了解,我将不胜感激。

【问题讨论】:

  • 如果你省略了 break 它会执行下面的所有语句。在您的情况下,它将为 SomeEnum.a 案例执行所有 3 个控制台日志,为 SomeEnum.b 执行 2 个控制台日志,为 SomeEnum.c 执行一个控制台日志

标签: typescript enums switch-statement


【解决方案1】:

switch 语句运行第一个匹配项中的所有代码。它在找到匹配项时不会检查其他情况。例如,如果您通过a,它将记录123。如果你通过b。它将返回23。它将继续运行,并且仅省略匹配之前的代码。 break 告诉您的 switch 语句它可以停在那里。它的工作方式类似于return

这不像if-statement,更像是:

if (SomeEnum.a) {
  ... run this code and all other code after it.
}

if (SomeEnum.b) {
  ... run this code and all other code after it
}

...

【讨论】:

  • 是的,这是有道理的,并且也匹配行为,但有点奇怪和令人困惑的是,在第一个案例匹配之后,它会忽略以下所有案例及其条件并执行所有操作。 . 使其行为与您键入的链式 if 语句不同,因此会造成混淆。
  • 确实如此。当您第一次看到它时,这是一种令人困惑的行为。但从长远来看,我相信可以选择不使用 break 关键字并让它执行所有操作。
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多