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 的位置处的可选链表达式。
此规则的错误代码示例
在 Playground 中打开
/*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;
}
此规则的正确代码示例
在 Playground 中打开
/*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 }
选项时,此规则的其他错误代码示例
在 Playground 中打开
/*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 中引入。