microsoft / microsoft/TypeScript
Some types are incorrectly assignable from a generic distributive conditional type
Dieses Issue hat noch niemand übernommen.
- 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.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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