microsoft / microsoft/TypeScript

Some types are incorrectly assignable from a generic distributive conditional type

Offen
#32,066 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

TypeScript Version: 3.5.1

Search Terms: generic conditional distributive assignable from

Code

type Keys<T extends object> = T extends unknown ? keyof T : never;

function f<T extends object>(keys: keyof T, moreKeys: Keys<T>) {
    keys = moreKeys;
}

// With this instantiation, `keys` is typed 'a',
// and `moreKeys` is typed 'a' | 'b' | 'c'. The latter
// should not be assignable to the former, but it happens
// in the generic context of the function `f`.
f<{ a: any, b: any } | { a: any, c: any }>('a', 'b');

Expected behavior:

Keys<T> should not be assignable to keyof T since Keys<T> is distributive and will produce a different type than keyof T when T is a union type.

Note that the reverse of this assignment, moreKeys = keys, errors for this exact reason; without a concrete T, it’s hard to tell what the relationship should be, so we simply have no relationship in place.

Actual behavior:

The unsafe assignment is allowed.

Playground Link

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

Beginne damit, das generische Beispiel für einen distributiven bedingten Typ im verlinkten Playground zu reproduzieren. Verfolge den Typprüfpfad für die Zuweisbarkeit im generischen Kontext und füge dann einen Regressionstest hinzu, der die unsichere Zuweisung und das angegebene Verhalten bei der umgekehrten Zuweisung abdeckt. Als erledigt gilt es, wenn der Aufruf mit 'b' abgelehnt wird, weil Keys nicht keyof T zugewiesen werden kann.

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.