Aller au contenu

noUnsafeOptionalChaining

Ce contenu n’est pas encore disponible dans votre langue.

Disallow the use of optional chaining in contexts where the undefined value is not allowed.

The optional chaining (?.) expression can short-circuit with a return value of undefined. Therefore, treating an evaluated optional chaining expression as a function, object, number, etc., can cause TypeError or unexpected results. Also, parentheses limit the scope of short-circuiting in chains.

1 in obj?.foo;
code-block.js:1:9 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ 1 in obj?.foo;
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ 1 in obj?.foo;
^^^^^^^^^^^^^
2 │

with (obj?.foo);
code-block.cjs:1:10 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ with (obj?.foo);
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ with (obj?.foo);
^^^^^^^^^^^^^^^^
2 │

for (bar of obj?.foo);
code-block.js:1:16 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ for (bar of obj?.foo);
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ for (bar of obj?.foo);
^^^^^^^^^^^^^^^^^^^^^^
2 │

bar instanceof obj?.foo;
code-block.js:1:19 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ bar instanceof obj?.foo;
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ bar instanceof obj?.foo;
^^^^^^^^^^^^^^^^^^^^^^^
2 │

const { bar } = obj?.foo;
code-block.js:1:20 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ const { bar } = obj?.foo;
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ const { bar } = obj?.foo;
^^^^^^^^^^^^^^^^^^
2 │

(obj?.foo)();
code-block.js:1:5 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ (obj?.foo)();
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ (obj?.foo)();
^^
2 │

(baz?.bar).foo;
code-block.js:1:5 lint/correctness/noUnsafeOptionalChaining ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Unsafe usage of optional chaining.

> 1 │ (baz?.bar).foo;
^^
2 │

If it short-circuits with ‘undefined’ the evaluation will throw TypeError here:

> 1 │ (baz?.bar).foo;
^^^
2 │

(obj?.foo)?.();
obj?.foo();
(obj?.foo ?? bar)();
obj?.foo.bar;
obj.foo?.bar;
foo?.()?.bar;
biome.json
{
"linter": {
"rules": {
"correctness": {
"noUnsafeOptionalChaining": "error"
}
}
}
}