Microsoft/TypeScript

Spread operator mixed with destructuring assignment resulting in unsoundness

Open

#54.402 aberto em 25 de mai. de 2023

Ver no GitHub
 (3 comments) (0 reactions) (0 assignees)TypeScript (6.726 forks)batch import
Domain: flag: noUncheckedIndexedAccessHelp WantedPossible Improvement

Métricas do repositório

Stars
 (48.455 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)

Description

Bug Report

This might have been covered before but I am not sure how to best search for it, apologies if it is a duplicate - when destructuring assignment is used with a spread operator (see example below) TS seems to ignore the possibility that the variable could be assigned undefined.

🔎 Search Terms

spread, destructure, destructuring

🕗 Version & Regression Information

  • This is the behavior in every version I tried (since 4.1.5 which is the oldest version on the playground with noUncheckedIndexedAccess available)

⏯ Playground Link

Playground link with relevant code

💻 Code

const [a] = [...(false ? (["a"] as const) : [])];
//     ^?
const b = false ? (["a"] as const) : [];
//    ^?
const c = [...b];
//    ^?
const [d] = c;
//     ^?

const [a_prime] = [...(false ? (["a"] as const) : [] as const)];
//     ^?

🙁 Actual behavior

a is typed as "a", while d and a_prime are typed as "a" | undefined". Note this only happens when noUncheckedIndexedAccess is enabled, otherwise all of them are typed as "a".

Note that d is the unrolled version of a which makes it more surprising that TS is typing them differently.

🙂 Expected behavior

They should all be typed "a" | undefined.

Guia do colaborador