microsoft / microsoft/TypeScript
Type inference on tuple intersection types broken
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.4k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
🔎 Search Terms
infer tuple intersection
🕗 Version & Regression Information
- Version 5.5.4
⏯ Playground Link
💻 Code
type Target = [number, string, boolean] & { att: string; };
type A = Readonly<Target>; // wishful thinking
type Head1 = Target extends [infer H, ...infer Tail] ? H : never; // doesn't work
type Head2 = Target extends [infer H, ...any[]] ? H : never; // works
type Tail1 = Target extends [infer H, ...infer Tail] ? Tail : never; // doesn't work
type Tail2 = Target extends [any, ...infer Tail] ? Tail : never; // doesn't work
type ReverseHead1 = Target extends [...infer RTail, infer RH] ? RH : never; // doesn't work
type ReverseHead2 = Target extends [...any[], infer RH] ? RH : never; // doesn't work
type ReverseTail1 = Target extends [...infer RTail, infer RH] ? RTail : never; // doesn't work
type ReverseTail2 = Target extends [...infer RTail, any] ? RTail : never; // doesn't work
🙁 Actual behavior
Doesn't work
🙂 Expected behavior
Works
Additional information about the issue
I would expect Readonly<[number, string, boolean] & { att: string }> to be readonly [number, string, boolean] & { readonly att: string }, but that's wishful thinking. I'm sure you guys got a myriad of reasons and design limitations that don't allow it; weak types, homomorphic, variance, instantiation and whatnot.
In any case, I thought, whatever, I'll do it myself with some infers... but it looks like I won't be able to do the general case because infers break on tuple types that are intersected.
So, just letting you know in case you care... here are some unexpected behaviors ✌️
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il TypeScript Playground collegato e confronta i risultati inferiti per ogni tipo condizionale che coinvolge la tupla intersecata. Traccia come vengono gestiti i tipi intersezione di tuple durante l’inferenza dei tipi condizionali, soprattutto per i pattern di testa e coda. Il lavoro è completato quando i casi di inferenza elencati producono gli elementi della tupla attesi senza introdurre regressioni nel comportamento esistente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100