Spec-Zone.ru › ESLint

no-dupe-else-if

Запрещает дублирующиеся условия в цепочках if-else-if

✅ Рекомендуется

Использование конфигурации recommended из @eslint/js в файле конфигурации включает это правило

Цепочки if-else-if часто используются, когда требуется выполнить только одну ветвь (или не более одной) из нескольких возможных ветвей в зависимости от определённых условий.

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

Два идентичных условия проверки в одной цепочке почти всегда указывают на ошибку в коде. Если только выражения не имеют побочных эффектов, дубликат вернёт то же значение true или false, что и идентичное выражение выше по цепочке, а значит, его ветвь никогда не выполнится.

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

В приведённом выше примере baz() никогда не выполнится. Очевидно, что baz() может выполниться только в том случае, если b принимает значение true, однако тогда вместо него выполнится 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();
    }
}

Параметры

У этого правила нет параметров.

Когда не следует использовать это правило

В редких случаях, когда в одной цепочке действительно нужны идентичные условия проверки, что неизбежно означает, что выражения в цепочке вызывают побочные эффекты и зависят от них, это правило придётся отключить.

Связанные правила

  • no-duplicate-case
  • no-lonely-if

Версия

Это правило появилось в ESLint v6.7.0.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-dupe-else-if

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API