Description
Bug Report
🔎 Search Terms
A rest element must be last in a tuple type.
🕗 Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about rest elements and tuples.
Specifically, I tried it with 4.1.5 right now. Note that 4.0.5 behaved a bit differently (but still buggy), see below.
Note that the behavior is normal in versions ≤4.0, since that’s when non-final rest elements were allowed in tuples.
⏯ Playground Link
Playground link with relevant code
💻 Code
type Strings = [string, string];
type Numbers = number[];
type Unbounded = [...Strings, ...Numbers, boolean];
🙁 Actual behavior
The ...Numbers
part generates an error: TS1256: A rest element must be last in a tuple type.
This exact code appears in TypeScript 4.0 release notes, thus presumably should work. (Search for “the resulting type becomes unbounded”.)
Note: I encountered something similar with 4.0.5 earlier. There, the non-final unbounded rest elements worked, but only via a type alias. They didn’t work with literal arrays in the tuple definition:
type Numbers = number[];
type Unbounded1 = [boolean, ...number[]]; // OK
type Unbounded2 = [...Numbers, boolean]; // OK
type Unbounded3 = [...number[], boolean]; // NOK
🙂 Expected behavior
The feature should work as documented. TypeScript should generate unbounded tuples type that work the “obvious” way.