microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
101.17k stars 12.51k forks source link

Destructuring a possibly `undefined` object not caught, throws an error at runtime #60179

Open bengry opened 1 month ago

bengry commented 1 month ago

🔎 Search Terms

destructuring, Cannot destructure as it is undefined, optional chaining destructuring

🕗 Version & Regression Information

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.6.2#code/MYewdgzgLgBAlmADgVygLhgbwLACgYEwCGA-BpjAEZlYzAbQBOCA5jAL4d6cC8tRGZGAAmAUwBmCUcK648oSLAoA6VZQ4w+CFFGWlllIA

💻 Code

const input: {
    a?: { b?: { c: string } }
} = { a: undefined }

const { ...b } = input.a?.b

🙁 Actual behavior

No error reported by TypeScript.

🙂 Expected behavior

TypeScript should have an indicative error, since this expression might result in undefined, which cannot be destructured.

Similar to this: Image

Rest types may only be created from object types.(2700)

Additional information about the issue

The error in the JavaScript being ran is:

Uncaught TypeError: Cannot destructure '(intermediate value)' as it is undefined.

MartinJohns commented 1 month ago

@Andarist Does your PR #60121 fix this as well?

Andarist commented 1 month ago

Yes :) https://github.com/microsoft/TypeScript/pull/60121/commits/c0ef60948eb1910d923cb26252d2f4781adcd284