microsoft / microsoft/TypeScript

TS2536 thown when using keyof on a property of a generic type as key

Aperta
#36,631 1 commento 8 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Domain: Indexed Access Types
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
2g 4h
PR unite (30g)
132

Descrizione

TypeScript Version: 3.8.0-dev.20200204

Search Terms:

  • TS2536
  • generic typing
  • keyof

Code

enum Switch {
    A = 'a',
    B = 'b',
}

interface ResultA {
    keyA1: number;
    keyA2: string;
}

type ResultB = number[];
type ResultType = ResultA | ResultB;

interface GenericBase {
    switch: Switch;
    value: ResultType;
}

interface GenericA extends GenericBase {
    switch: Switch.A;
    value: ResultA;
}

interface GenericB extends GenericBase {
    switch: Switch.B;
    value: ResultB;
}

type GenericType = GenericA | GenericB;

function getValue<T extends GenericType, K extends keyof T['value']>(result: T, key: K): T['value'][K] {
    // T = GenericA
    // T['value'] = ResultA
    // keyof ResultA = 'keyA1' | 'keyA2'

    // T = GenericB
    // T['value'] = ResultB
    // keyof ResultB = number | "toString" | [...]

    // unexpected: error TS2536: Type 'K' cannot be used to index type 'ResultType'.
    return result.value[key];
}

const a: GenericA = {switch: Switch.A, value: {keyA1: 1, keyA2: 'A'}};
const b: GenericB = {switch: Switch.B, value: [1, 2, 3]};

// no errors
console.log(getValue(a, 'keyA1'));
console.log(getValue(a, 'keyA2'));
console.log(getValue(b, 0));
console.log(getValue(b, 3));

// error TS2345: Argument of type '0' is not assignable to parameter of type '"keyA1" | "keyA2"'.
// => expected, and the compiler does know what keys can be used
console.log(getValue(a, 0));

// error TS2345: Argument of type '"keyA1"' is not assignable to parameter of type 'number | "toString" [...]
// => also expected
console.log(getValue(b, 'keyA1'));

Expected behavior:
As long as the correct keys are used, which is covered by TS2345, the index access should not raise an error.

Actual behavior:
TS2536 is thrown when compiling, altough the keys should be known due to the generic typing.

Playground Link: typescriptlang.org

Related Issues:

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

Riproduci l'errore TS2536 segnalato utilizzando il codice fornito, TypeScript 3.8.0-dev.20200204 e il link al Playground. Inizia verificando se il comportamento si verifica ancora con typescript@next, come richiesto nell'issue. Il lavoro è completato quando l'accesso indicizzato valido viene compilato, mentre le chiamate non valide mostrate continuano a produrre errori TS2345.

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
Specificata chiaramente
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.