microsoft / microsoft/TypeScript
Fail to infer Indexed access to the intersection type when it includes an union derived from a generic input
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
🔎 Search Terms
"indexed access on union", "generic index"
🕗 Version & Regression Information
5.6.2, and it seems never worked for every ts versions.
⏯ Playground Link
💻 Code
type Test<T extends string> = {[K in T]: {key: K}}[T] & {target: string}
const foo = <T extends string>(arg: Test<T>) => {
const value: Test<T> = arg;
const value2: Test<T>['key'] = arg['key'];
const value3: Test<T>['target'] = arg['target']; // Error
}
🙁 Actual behavior
The declaration of value and value2 works well, but ts emit an error saying Type 'string' is not assignable to type '{ [K in T]: { key: K; }; }[T]["target"] & string' for value3.
🙂 Expected behavior
The Test<T>['target'] should equal to string and assume the type of '{ [K in T]: { key: K; }; }[T]["target"] as any before intersection, as it does when I give non-generic type in the same place. It seems even weird because it well infers the type of Test<T>['key'].
Additional information about the issue
With additional experiment, I found that it always happens when I generate an union type with generic input. For instance,
type Test<T> = (T extends string ? {key: number} : {key: string}) & {target: string}
const foo = <T extends string>(arg: Test<T>) => {
const value: Test<T> = arg;
const value2: Test<T>['key'] = arg['key'];
const value3: Test<T>['target'] = arg['target']; // Error
}
it also does not work in the case above
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 la riproduzione collegata in TypeScript Playground e confronta i casi di indexed access generico e non generico mostrati nell’issue. Il lavoro è completato quando l’indexed access generico per il tipo intersezione accetta il valore string per la proprietà di destinazione senza produrre l’errore di tipo segnalato, mentre l’inferenza delle chiavi esistente rimane corretta.
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