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