microsoft / microsoft/TypeScript
Incomprehensible incompatibility around Partial, Conditional types and Generics.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.4k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
TypeScript Version: 3.9.0-dev.20200322
Search Terms: partial, conditional types
Code
type SafePartial<T> = T extends {} ? Partial<T> : any;
interface QB<TRecord extends {}> {
insert(record: SafePartial<TRecord>): void;
}
async function insert1<TRecord extends {}>(qb: QB<TRecord>, record: TRecord) {
await qb.insert(record);
}
Expected behavior:
The code successfully compiles
Actual behavior:
Following error is observed for qb.insert(record):
Argument of type 'TRecord' is not assignable to parameter of type 'SafePartial<TRecord>'. Type '{}' is not assignable to type 'SafePartial<TRecord>'.
The issue goes away if I use Partial instead of the SafePartial above.
The issue also goes away if a concrete type is used instead of generic type:
interface User {
id: string;
}
async function insert1(qb: QB<User>, record: User) {
await qb.insert(record);
}
Playground Link: Playground
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 mit der verlinkten TypeScript-Playground-Reproduktion und vergleiche den generischen Fall mit bedingtem Typ mit den funktionierenden Fällen mit Partial und konkreten Typen. Verfolge die Zuweisbarkeitsbehandlung des Compilers für SafePartial und bestätige das Verhalten mit einer reduzierten Reproduktion. Als erledigt gilt die Aufgabe, wenn der ursprüngliche Code kompiliert, ohne die gemeldeten Typen abzuschwächen.
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
- 42/100