no-unsafe-negation
禁止对关系运算符的左操作数取反
就像开发人员在表示和的负数时可能会键入 -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 中引入。