microsoft / microsoft/TypeScript
Tuple Spread Inconsistencies When Intersected
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
🔎 Search Terms
Tuple, Intersection, Spread
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about tuples and arrays
⏯ Playground Link
💻 Code
type Tuple = [string, ...number[]];
type TupleIntersection = Tuple & { prop: string };
type TupleRestAccess = Tuple[1];
// ^ number
type TupleIntersectionRestAccess = TupleIntersection[1];
// ^ string | number
type TupleSpread = [...Tuple];
// ^ [string, ...number[]]
type TupleIntersectionSpread = [...TupleIntersection];
// ^ (string | number)[]
🙁 Actual behavior
TupleIntersection[1] and [...TupleIntersection] both seem to use an overly broad type, matching the number index signature instead of the more narrow spread signature.
What I mean is that TupleIntersection[1] behaves just like Tuple[number] does. This leads me to believe that the number index signature is synthesized correctly but the logic for numeric literals in the range of the spread signature aren't handled.
🙂 Expected behavior
I expected Tuple's behaviour to match TupleIntersection.
Additional information about the issue
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked TypeScript Playground reproduction and compare the shown indexed-access and spread results for Tuple versus TupleIntersection. Trace the compiler entry points handling tuple intersections, numeric literal access, and tuple spreads; done means the intersection preserves the tuple's narrower spread behavior and the reproduction matches the expected types.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100