版本

no-unsafe-negation

禁止对关系运算符的左操作数取反

推荐

配置文件中使用来自 @eslint/jsrecommended 配置将启用此规则。

💡 hasSuggestions

此规则报告的一些问题可以通过编辑器建议手动修复。

就像开发人员在表示和的负数时可能会输入 -a + b 而非 -(a + b) 一样,他们也可能会错误地输入 !key in object,而他们几乎肯定想要输入 !(key in object) 来测试一个键是否不在对象中。!obj instanceof Ctor 也是类似的。

规则详情

此规则禁止对以下关系运算符的左操作数取反。

此规则的**错误**代码示例

在代码运行环境中打开
/*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.
}

此规则的**正确**代码示例

在代码运行环境中打开
/*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 (!(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 } 选项时,此规则的其他**错误**代码示例。

在代码运行环境中打开
/*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 中引入。

资源

更改语言