microsoft / microsoft/TypeScript
`as const` breaks intra expression inference
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 2 T. 4 Std.
- Gemergte PRs (30 T.)
- 132
Beschreibung
🔎 Search Terms
const context expression assertion inference type parameter
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
declare function test<T, D>(arg: {
input: D;
produce: (arg: D) => T;
consume: (arg: T) => number;
}): D;
const broken = test({
input: 100,
produce: (arg) => arg.toString(), // 'arg' is of type 'unknown'.(18046)
consume: (arg) => arg.length,
} as const);
const working = test({
input: 100,
produce: (arg) => arg.toString(), // `arg` inferred as `number`
consume: (arg) => arg.length,
});
🙁 Actual behavior
as const is the only difference between those two and its presence breaks assigned parameter type in produce
🙂 Expected behavior
I think as const should not impact inference this way and both should be inferred just OK. It's just that the broken case should infer 100 instead of number for the D type parameter
Additional information about the issue
No response
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 dem verlinkten TypeScript Playground und vergleiche die Beispiele broken und working. Verfolge anschließend, wie sich die as const-Assertion auf das kontextuelle Typisieren und die Inferenz für produce auswirkt. Als erledigt gilt die Aufgabe, wenn der Callback-Parameter im Fall mit Assertion ohne unknown inferiert wird und die erwartete Literal-Inferenz 100 für D erhalten bleibt.
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
- 42/100