microsoft / microsoft/TypeScript
Discriminated union narrowing fails when use template literal types as tag
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
TypeScript Version: 4.2.0-dev.20201211
Search Terms: narrowing, discriminated union, template literal types
Code
type Types<T extends string> = {
one: `${T}/one`;
two: `${T}/two`;
}
type OneObj<T extends string> = {
type: Types<T>["one"];
one: string;
}
type TwoObj<T extends string> = {
type: Types<T>["two"];
two: string;
}
type OneOrTwoObj<T extends string> = OneObj<T> | TwoObj<T>
declare function acceptsOneObj<T extends string>(oneObj: OneObj<T>): void;
declare function acceptsTwoObj<T extends string>(twoObj: TwoObj<T>): void;
function f<T extends string>(oneOrTwoObj: OneOrTwoObj<T>, types: Types<T>){
switch(oneOrTwoObj.type){
case types.one:
return acceptsOneObj(oneOrTwoObj); // Error: Argument of type 'OneOrTwoObj<T>' is not assignable to parameter of type 'OneObj<T>'.
case types.two:
return acceptsTwoObj(oneOrTwoObj); // Error: Argument of type 'OneOrTwoObj<T>' is not assignable to parameter of type 'OneObj<T>'.
}
}
Expected behavior:
oneOrTwoObj should be narrowed to OneObj or TwoObj in function f
Actual behavior:
narrowing fails
Playground Link:
playground
Related Issues:
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 dalla riproduzione collegata in TypeScript Playground e dalla funzione generica f, concentrandoti su come lo switch su oneOrTwoObj.type gestisce i tipi literal di template. Conferma il comportamento attuale, quindi traccia il percorso del controllo dei tipi per il narrowing delle unioni discriminate. Il lavoro è completato quando ogni ramo dello switch restringe oneOrTwoObj al corrispondente OneObj o TwoObj, in modo che le chiamate a acceptsOneObj e acceptsTwoObj superino il controllo dei tipi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100