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