版本

no-dupe-else-if

禁止在 if-else-if 链中出现重复条件

推荐

配置文件中使用来自 @eslint/jsrecommended 配置将启用此规则

if-else-if 链通常用于需要根据某些条件从多个可能的分支中仅执行一个分支(或最多一个分支)时。

if (a) {
    foo();
} else if (b) {
    bar();
} else if (c) {
    baz();
}

在同一链中出现两个相同的测试条件几乎总是代码中的错误。除非表达式中存在副作用,否则重复的表达式将与链中较早的相同表达式计算出相同的 truefalse 值,这意味着它的分支永远不会执行。

if (a) {
    foo();
} else if (b) {
    bar();
} else if (b) {
    baz();
}

在上面的示例中,baz() 永远不会执行。显然,只有当 b 计算结果为 true 时,baz() 才能执行,但在这种情况下,bar() 将会执行,因为它在链中更早。

规则详情

此规则禁止在同一 if-else-if 链中出现重复条件。

此规则的错误代码示例

在 Playground 中打开
/*eslint no-dupe-else-if: "error"*/

if (isSomething(x)) {
    foo();
} else if (isSomething(x)) {
    bar();
}

if (a) {
    foo();
} else if (b) {
    bar();
} else if (c && d) {
    baz();
} else if (c && d) {
    quux();
} else {
    quuux();
}

if (n === 1) {
    foo();
} else if (n === 2) {
    bar();
} else if (n === 3) {
    baz();
} else if (n === 2) {
    quux();
} else if (n === 5) {
    quuux();
}

此规则的正确代码示例

在 Playground 中打开
/*eslint no-dupe-else-if: "error"*/

if (isSomething(x)) {
    foo();
} else if (isSomethingElse(x)) {
    bar();
}

if (a) {
    foo();
} else if (b) {
    bar();
} else if (c && d) {
    baz();
} else if (c && e) {
    quux();
} else {
    quuux();
}

if (n === 1) {
    foo();
} else if (n === 2) {
    bar();
} else if (n === 3) {
    baz();
} else if (n === 4) {
    quux();
} else if (n === 5) {
    quuux();
}

此规则还可以检测某些条件不相同但由于 ||&& 运算符的逻辑导致分支永远不会执行的情况。

此规则的其他错误代码示例

在 Playground 中打开
/*eslint no-dupe-else-if: "error"*/

if (a || b) {
    foo();
} else if (a) {
    bar();
}

if (a) {
    foo();
} else if (b) {
    bar();
} else if (a || b) {
    baz();
}

if (a) {
    foo();
} else if (a && b) {
    bar();
}

if (a && b) {
    foo();
} else if (a && b && c) {
    bar();
}

if (a || b) {
    foo();
} else if (b && c) {
    bar();
}

if (a) {
    foo();
} else if (b && c) {
    bar();
} else if (d && (c && e && b || a)) {
    baz();
}

请注意,此规则不会将链中的条件与语句内部的条件进行比较,并且在以下情况下不会发出警告

if (a) {
    if (a) {
        foo();
    }
}

if (a) {
    foo();
} else {
    if (a) {
        bar();
    }
}

何时不使用它

在您确实需要在同一链中使用相同的测试条件的罕见情况下,这必然意味着链中的表达式正在导致并依赖于副作用,您需要关闭此规则。

版本

此规则在 ESLint v6.7.0 中引入。

资源

更改语言