microsoft / microsoft/TypeScript

Fail to infer Indexed access to the intersection type when it includes an union derived from a generic input

Aperta
#59,946 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Domain: Indexed Access Types Help Wanted Possible Improvement
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

https://www.typescriptlang.org/play/?ts=5.6.2#code/C4TwDgpgBAKhDOwA8MoQB7AgOwCbykQCcBLbAcwD4oBeKAbwG0BpKM2AXQC4GBrCED2YBfYYxgcoAMgbAAhkXIRgPYmXLCAUJoDGAe2yIoAMz17aUFGkw58hYKQqUAFAvI84iFJQCUtavSaUMFQ+obAUABucgA2AK4QHgjIMNR0bgDcQSFhRtHxEABMSV6pjADk-CDlkumKFVU1WSGhBnmxCQDMJSmUFfKKyjUWbv1uQxwZUAD001AAokREekSawkA

💻 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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.