no-unsafe-optional-chaining
禁止在不允许使用 undefined
值的上下文中使用可选链
✅ 推荐
在 配置文件 中使用来自 @eslint/js
的 recommended
配置将启用此规则
可选链 (?.
) 表达式可以短路并返回 undefined
值。因此,将计算后的可选链表达式视为函数、对象、数字等可能会导致 TypeError 或意外结果。例如
var obj = undefined;
1 in obj?.foo; // TypeError
with (obj?.foo); // TypeError
for (bar of obj?.foo); // TypeError
bar instanceof obj?.foo; // TypeError
const { bar } = obj?.foo; // TypeError
此外,括号限制了链中短路的范围。例如
var obj = undefined;
(obj?.foo)(); // TypeError
(obj?.foo).bar; // TypeError
规则详情
此规则旨在检测一些使用可选链无法防止运行时错误的情况。特别是,它会标记可选链表达式出现在短路到 undefined
之后会导致抛出 TypeError 的位置。
此规则的错误代码示例
在代码运行环境中打开
/*eslint no-unsafe-optional-chaining: "error"*/
()();
().bar;
().bar;
().bar();
(obj?.foo ?? )();
(foo || )();
( && foo)();
(foo ? : bar)();
(foo, ).baz;
()`template`;
new ()();
[...];
bar(...);
1 in ;
bar instanceof ;
for (bar of );
const { bar } = ;
[{ bar } = ] = [];
with ();
class A extends {}
var a = class A extends {};
async function foo () {
const { bar } = await ;
(await )();
(await ).bar;
}
此规则的正确代码示例
在代码运行环境中打开
/*eslint no-unsafe-optional-chaining: "error"*/
(obj?.foo)?.();
obj?.foo();
(obj?.foo ?? bar)();
obj?.foo.bar;
obj.foo?.bar;
foo?.()?.bar;
(obj?.foo ?? bar)`template`;
new (obj?.foo ?? bar)();
var baz = {...obj?.foo};
const { bar } = obj?.foo || baz;
async function foo () {
const { bar } = await obj?.foo || baz;
(await obj?.foo)?.();
(await obj?.foo)?.bar;
}
选项
此规则有一个对象选项
disallowArithmeticOperators
:禁止对可选链表达式进行算术运算 (默认值为false
)。如果设置为true
,则此规则会警告对可选链表达式的算术运算,这可能会导致NaN
。
disallowArithmeticOperators
将此选项设置为 true
时,将对以下情况执行此规则
- 一元运算符:
-
、+
- 算术运算符:
+
、-
、/
、*
、%
、**
- 赋值运算符:
+=
、-=
、/=
、*=
、%=
、**=
使用 { "disallowArithmeticOperators": true }
选项时,此规则的其他错误代码示例
在代码运行环境中打开
/*eslint no-unsafe-optional-chaining: ["error", { "disallowArithmeticOperators": true }]*/
+;
-;
+ bar;
- bar;
/ bar;
* bar;
% bar;
** bar;
baz += ;
baz -= ;
baz /= ;
baz *= ;
baz %= ;
baz **= ;
async function foo () {
+await ;
await + bar;
baz += await ;
}
版本
此规则在 ESLint v7.15.0 中引入。