49 lines
1.2 KiB
Plaintext
49 lines
1.2 KiB
Plaintext
![]() |
Disallow the use of optional chaining in an expression where the `undefined` value would raise an error.
|
||
|
|
||
|
== Why is this an issue?
|
||
|
|
||
|
The optional chaining operator `?.` allows to access a deeply nested property, returning `undefined` if the property or any intermediate object is `undefined`.
|
||
|
|
||
|
This usually means that we expect the expression to evaluate as `undefined` in some cases. Therefore, using the optional chaining operator in a context where returning `undefined` is forbidden can lead to errors.
|
||
|
|
||
|
=== What is the potential impact?
|
||
|
|
||
|
Since optional chaining represents multiple execution branches, having an error thrown in such a context can be hard to debug.
|
||
|
|
||
|
== How to fix it
|
||
|
|
||
|
You should provide fallbacks for when the optional chaining operator is used to avoid runtime errors.
|
||
|
|
||
|
=== Code examples
|
||
|
|
||
|
==== Noncompliant code example
|
||
|
|
||
|
[source,javascript]
|
||
|
----
|
||
|
new (foo?.bar)();
|
||
|
const { foo } = bar?.baz;
|
||
|
const foo = [...bar?.baz]
|
||
|
----
|
||
|
|
||
|
==== Compliant solution
|
||
|
|
||
|
[source,javascript]
|
||
|
----
|
||
|
new (foo?.bar ?? baz)()
|
||
|
const { foo } = bar?.baz || {}
|
||
|
const foo = bar?.baz ? [...bar.baz] : []
|
||
|
----
|
||
|
|
||
|
//=== How does this work?
|
||
|
|
||
|
//=== Pitfalls
|
||
|
|
||
|
//=== Going the extra mile
|
||
|
|
||
|
|
||
|
//== Resources
|
||
|
//=== Documentation
|
||
|
//=== Articles & blog posts
|
||
|
//=== Conference presentations
|
||
|
//=== Standards
|