noUnsafeOptionalChaining
Diagnostic Category: lint/correctness/noUnsafeOptionalChaining
Since: v1.0.0
Sources:
- Same as: 
no-unsafe-optional-chaining 
Description
Section titled “Description”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.
Examples
Section titled “Examples”Invalid
Section titled “Invalid”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;How to configure
Section titled “How to configure”{  "linter": {    "rules": {      "correctness": {        "noUnsafeOptionalChaining": "error"      }    }  }}