microsoft / microsoft/TypeScript

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

Offen
#36,631 1 Kommentar 8 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Domain: Indexed Access Types
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

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:

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere den gemeldeten TS2536-Fehler mit dem bereitgestellten Code, TypeScript 3.8.0-dev.20200204 und dem Playground-Link. Prüfe zunächst, ob das Verhalten mit typescript@next weiterhin auftritt, wie im Issue angefordert. Als erledigt gilt die Aufgabe, wenn ein gültiger indizierter Zugriff kompiliert wird, während die gezeigten ungültigen Aufrufe weiterhin TS2345-Fehler erzeugen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.