microsoft / microsoft/TypeScript
Probable bug: Functional properties don't get inferred with circular type parameter constraints like `T extends M<T>`
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:
4.0.2
Search Terms:
Circular type parameter constraint, functional property inference, function parameter inference, function argument inference
Code:
declare const m: <T extends M<T>>(m: T) => T
type M<Self, K = Exclude<keyof Self, "k" | "t">> =
{ a?: number
, b?: number
, c?: number
, d?: number
, k?: K
, t?: (k: K) => void
}
// :)
// Case 1
m({
a: 1,
b: 2,
k: "a"
})
// :)
// Case 2
m({
a: 1,
b: "x", // expected error
k: "c" // expected error
})
// :(
// Case 3
m({ // type parameter becomes `unknown` (probably because t's first parameter is `any` initially kinda?)
a: 1,
b: 2,
k: "a",
t: k => {} // k is inferred as `never` (instead of `"a" | "b"`)
})
// :|
// Case 4
m({
a: 1,
b: 2,
k: "a",
t: (k: "a" | "b") => {} // have to explicitly type `k` which could have been inferred :(
})
Expected behavior:
The parameter k of t should be inferred as "a" | "b". As property k already gets inferred in Case 1 & 2, so why not the k parameter of t
Actual behavior:
The parameter of t is inferred as never and T in inferred as unknown. I assume first T gets resolved to unknown as t is initially inferred as (k: any) => void which does not satisfy the constraint of m.
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 Beispiel mit zirkulärer Einschränkung im verknüpften TypeScript Playground zu reproduzieren und vergleiche die inferierten Typen in Cases 3 und 4. Verfolge die Inferenz von Typparametern und Funktionsparametern des Compilers für T extends M; als erledigt gilt die Aufgabe, wenn der Parameter k als "a" | "b" inferiert wird und T nicht mehr unknown ist.
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
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100