no-unsafe-negation
Запретить отрицание левого операнда операторов сравнения
Использование конфигурации recommended из @eslint/js в файле конфигурации включает эту проверку
Некоторые проблемы, выявленные этой проверкой, могут быть вручную исправлены с помощью предложений редактора
Так же, как разработчики могут написать -a + b, когда они подразумевают -(a + b) для отрицания суммы, они могут по ошибке написать !key in object, когда, скорее всего, хотят !(key in object), чтобы проверить, что ключ отсутствует в объекте. Аналогично !obj instanceof Ctor.
Подробное описание проверки
Эта проверка запрещает отрицание левого операнда следующих операторов сравнения:
Примеры некорректного кода для этой проверки:
/*eslint no-unsafe-negation: "error"*/
if ( in object) {
// operator precedence makes it equivalent to (!key) in object
// and type conversion makes it equivalent to (key ? "false" : "true") in object
}
if ( instanceof Ctor) {
// operator precedence makes it equivalent to (!obj) instanceof Ctor
// and it equivalent to always false since boolean values are not objects.
}
Примеры корректного кода для этой проверки:
/*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
}
Исключение
В редких случаях, когда отрицание левого операнда необходимо, эта проверка допускает исключение. Если всё отрицание явно заключено в скобки, проверка не будет сообщать об ошибке.
Примеры корректного кода для этой проверки:
/*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
}
Примеры некорректного кода для этой проверки:
/*eslint no-unsafe-negation: "error"*/
if ( in object) {
// this is not an allowed exception
}
Параметры
Эта проверка имеет объект параметров:
-
"enforceForOrderingRelations": false(по умолчанию) разрешает отрицание левой части операторов упорядочивания (<,>,<=,>=) -
"enforceForOrderingRelations": trueзапрещает отрицание левой части операторов упорядочивания
enforceForOrderingRelations
При установке этого параметра в значение true проверка дополнительно применяется к:
-
<оператор. -
>оператор. -
<=оператор. -
>=оператор.
Цель состоит в том, чтобы избежать выражений, таких как ! a < b (что эквивалентно (a ? 0 : 1) < b), когда на самом деле нужно !(a < b).
Примеры дополнительного некорректного кода для этой проверки с параметром { "enforceForOrderingRelations": true }:
/*eslint no-unsafe-negation: ["error", { "enforceForOrderingRelations": true }]*/
if ( < b) {}
while ( > b) {}
foo = <= b;
foo = >= 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