microsoft / microsoft/TypeScript

Computed type key inference inconsistent with identical explicitly declared type

Offen
#59,987 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

🔎 Search Terms

keyof required keys key evaluation reduce getReducedType

🕗 Version & Regression Information
  • This is the behavior in every version I tried
⏯ Playground Link

https://tsplay.dev/WKQkzN

💻 Code
type distilled = distill<{
	//   ^?
	foo: "default"
	bar?: number
}>

// incorrectly inferred as unknown
type requiredDistilledKey = requiredKeyOf<distilled>
//   ^?

// explicit declaration identical to hover of distilled
type declared = {
	bar?: number
} & {
	foo?: "default"
}

// now correctly inferred as never
type requiredDeclaredKey = requiredKeyOf<declared>
//   ^?

type requiredKeyOf<o> = {
	[k in keyof o]-?: o extends { [_ in k]-?: o[k] } ? k : never
}[keyof o]

type distill<t> = t extends object ? distillMappable<t> : t

type distillMappable<o> = {
	[k in keyof o as k extends inferredDefaultKeyOf<o> ? never : k]: distill<o[k]>
} & {
	[k in inferredDefaultKeyOf<o>]?: distill<o[k]>
}

type inferredDefaultKeyOf<o> = {
	[k in keyof o]: o[k] extends "default" ? k : never
}[keyof o]


🙁 Actual behavior

requiredDistilledKey inferred as unknown

🙂 Expected behavior

requiredDistilledKey inferred as never, consistent with the equivalent declared version

Additional information about the issue

No response

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

Reproduzieren Sie die Abweichung im verlinkten TypeScript Playground anhand der bereitgestellten Beispiele distill, requiredKeyOf und requiredDeclared. Verfolgen Sie, wie der berechnete Mapped-/Intersection-Typ reduziert wird und wie requiredKeyOf ihn auswertet; fertig ist die Aufgabe, wenn requiredDistilledKey als never inferiert wird und mit requiredDeclaredKey übereinstimmt.

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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.