Spec-Zone.ru › ESLint

no-unsafe-negation

Запрещает отрицание левого операнда операторов отношений

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

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

💡 Есть предложения

Некоторые проблемы, о которых сообщает это правило, можно исправить вручную с помощью предложений редактора

Разработчики могут ввести -a + b, когда имеют в виду -(a + b) для отрицания суммы; точно так же они могут по ошибке ввести !key in object, хотя почти наверняка имеют в виду !(key in object), чтобы проверить, что ключа нет в объекте. Аналогичная ситуация возникает с !obj instanceof Ctor.

Подробное описание правила

Это правило запрещает отрицание левого операнда следующих операторов отношений:

  • оператор in.
  • оператор instanceof.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-unsafe-negation: "error"*/

if (!key in object) {
    // operator precedence makes it equivalent to (!key) in object
    // and type conversion makes it equivalent to (key ? "false" : "true") in object
}

if (!obj instanceof Ctor) {
    // operator precedence makes it equivalent to (!obj) instanceof Ctor
    // and it equivalent to always false since boolean values are not objects.
}

Примеры правильного кода для этого правила:

Открыть в Playground
/*eslint no-unsafe-negation: "error"*/

if (!(key in object)) {
    // key is not in object
}

if (!(obj instanceof Ctor)) {
    // obj is not an instance of Ctor
}

Исключение

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

Примеры правильного кода для этого правила:

Открыть в Playground
/*eslint no-unsafe-negation: "error"*/

if ((!foo) in object) {
    // allowed, because the negation is explicitly wrapped in parentheses
    // it is equivalent to (foo ? "false" : "true") in object
    // this is allowed as an exception for rare situations when that is the intended meaning
}

if(("" + !foo) in object) {
    // you can also make the intention more explicit, with type conversion
}

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-unsafe-negation: "error"*/

if (!(foo) in object) {
    // this is not an allowed exception
}

Параметры

Это правило принимает параметр-объект:

  • "enforceForOrderingRelations": false (по умолчанию) допускает отрицание левой части операторов отношений порядка (<, >, <=, >=)
  • "enforceForOrderingRelations": true запрещает отрицание левой части операторов отношений порядка

enforceForOrderingRelations

Если для этого параметра задано значение true, правило также применяется к следующим операторам:

  • оператор <.
  • оператор >.
  • оператор <=.
  • оператор >=.

Это позволяет избежать выражений вроде ! a < b (что эквивалентно (a ? 0 : 1) < b), когда на самом деле подразумевается !(a < b).

Примеры дополнительного неправильного кода для этого правила с параметром { "enforceForOrderingRelations": true }:

Открыть в Playground
/*eslint no-unsafe-negation: ["error", { "enforceForOrderingRelations": true }]*/

if (! a < b) {}

while (! a > b) {}

foo = ! a <= b;

foo = ! a >= b;

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

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

Обрабатывается TypeScript

Это правило можно безопасно отключить при использовании TypeScript, поскольку компилятор TypeScript выполняет эту проверку.

Версия

Это правило появилось в ESLint v3.3.0.

Ресурсы

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

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

Spec-Zone.ru

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