Skip to content
← Back to rules

eslint/complexity Restriction

作用

强制规定程序中的最大 圈复杂度,即程序中线性独立路径的数量。

为什么不好?

代码复杂度过高会降低代码可读性。此规则旨在通过减少程序中的分支数量,使代码更易于遵循。

示例

此规则在 { "max": 2 } 配置下的 错误 代码示例

js
function foo() {
  if (foo1) {
    return x1; // 第 1 条路径
  } else if (foo2) {
    return x2; // 第 2 条路径
  } else {
    return x3; // 第 3 条路径
  }
}

function bar() {
  // 有 2 条路径 - 当 bar1 为假值时,以及当 bar1 为真值时,此时 bar1 = bar1 && bar2;
  bar1 &&= bar2;
  // 有 2 条路径 - 当 bar3 为真值时,以及当 bar3 为假值时,此时 bar3 = 4;
  bar3 ||= 4;
}

// 有 2 条路径 - 当 baz1 已定义时,以及当 baz1 未定义并被赋值为 'a' 时
function baz(baz1 = "a") {
  const { baz2 = "b" } = baz3; // 有 2 条额外路径 - 当 baz2 已定义时和当 baz2 未定义时
}

function d() {
  d1 = d2?.d3?.(); // 可选链各自创建 2 条路径 - 当对象已定义时和当它未定义时
}

此规则在 { "max": 2 } 配置下的 正确 代码示例

js
// 此示例直接取自 ESLint 文档
function foo() {
  // 此函数复杂度 = 1
  class C {
    x = a + b; // 此初始化器复杂度 = 1
    y = c || d; // 此初始化器复杂度 = 2
    z = e && f; // 此初始化器复杂度 = 2

    static p = g || h; // 此初始化器复杂度 = 2
    static q = i ? j : k; // 此初始化器复杂度 = 2

    static {
      // 此静态块复杂度 = 2
      if (foo) {
        baz = bar;
      }
    }

    static {
      // 此静态块复杂度 = 2
      qux = baz || quux;
    }
  }
}

配置

此规则接受一个具有以下属性的配置对象:

max

type: integer

default: 20

圈复杂度的最大数量

variant

type: "classic" | "modified"

default: "classic"

要使用的圈复杂度变体

"classic"

Classic 表示 McCabe 圈复杂度

"modified"

Modified 表示经典圈复杂度,但 switch 语句会增加复杂度 1,无论 case 语句的数量如何

如何使用

To enable this rule using the config file or in the CLI, you can use:

json
{
  "rules": {
    "complexity": "error"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  rules: {
    "complexity": "error",
  },
});
bash
oxlint --deny complexity

Version

此规则已在 v1.37.0 中添加。

References