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 中引入。