跳至内容

eslint/no-fallthrough 死板的

🚧一个自动修复仍处于开发中。

它做了什么

禁止 case 语句的直通

该规则旨在消除一个 case 无意中直通到另一个 case 的现象。因此,它标记了任何未由注释标记的直通场景。

为什么这样做不好?

JavaScript 中的 switch 语句是该语言中更易出错的结构之一,部分原因是可以从一个 case “直通”到下一个 case。例如

js
switch (foo) {
  case 1:
    doSomething();

  case 2:
    doSomethingElse();
}

在此示例中,如果 foo1,则执行将流经两个 case,因为第一个 case 直通到第二个 case。你可以使用 break 来防止这种情况发生,如下例所示

js
switch (foo) {
  case 1:
    doSomething();
    break;

  case 2:
    doSomethingElse();
}

当你不想要直通时,该方法运行良好,但如果直通是有意的,那么就无法在语言中指明这一点。一个最佳做法被认为是始终使用与 `/falls?\s?through/i`` 正则表达式相匹配但不是指令的注释表示直通是有意的

js
switch (foo) {
  case 1:
    doSomething();
  // falls through

  case 2:
    doSomethingElse();
}

switch (foo) {
  case 1:
    doSomething();
  // fall through

  case 2:
    doSomethingElse();
}

switch (foo) {
  case 1:
    doSomething();
  // fallsthrough

  case 2:
    doSomethingElse();
}

switch (foo) {
  case 1: {
    doSomething();
    // falls through
  }

  case 2: {
    doSomethingElse();
  }
}

在此示例中,预期行为毫无疑问。很明显,第一个 case 旨在直通到第二个 case。

示例

此规则不正确的代码示例

js
/*oxlint no-fallthrough: "error"*/

switch (foo) {
  case 1:
    doSomething();

  case 2:
    doSomething();
}

此规则正确的代码示例

js
/*oxlint no-fallthrough: "error"*/

switch (foo) {
  case 1:
    doSomething();
    break;

  case 2:
    doSomething();
}

function bar(foo) {
  switch (foo) {
    case 1:
      doSomething();
      return;

    case 2:
      doSomething();
  }
}

switch (foo) {
  case 1:
    doSomething();
    throw new Error("Boo!");

  case 2:
    doSomething();
}

switch (foo) {
  case 1:
  case 2:
    doSomething();
}

switch (foo) {
  case 1:
  case 2:
    doSomething();
}

switch (foo) {
  case 1:
    doSomething();
  // falls through

  case 2:
    doSomething();
}

switch (foo) {
  case 1: {
    doSomething();
    // falls through
  }

  case 2: {
    doSomethingElse();
  }
}

请注意,在这些示例中,最后一个 case 语句不会导致警告,因为没有可以直通的对象。

参考文献

在 MIT 许可下发布。