Mapped Types sind Typen, die dynamisch durch die Transformation (Umbenennung, Modifikation) aller Eigenschaften eines anderen Typs erstellt werden. Die Syntax basiert auf der Konstruktion in:
type Readonly<T> = { readonly [K in keyof T]: T[K]; } type User = { name: string; age: number; } const u: Readonly<User> = { name: 'Eve', age: 22 }; u.name = 'Bob'; // Fehler: name ist nur lesbar
Nuancen:
-? oder +?.Beispiel mit allen Modifikatoren:
type PartialMutable<T> = { -readonly [K in keyof T]?: T[K]; };
„Beeinflusst die Anwendung eines mapped types mit dem Modifikator optional nur die Eigenschaften der ersten Ebene oder auch die verschachtelten Objekte?“
Antwort: Nein, der mapped type mit optional ? beeinflusst NUR die Eigenschaften der ersten Ebene. Verschachtelte Objekte müssen separat transformiert werden, oft durch Rekursion oder zusätzliche mapped types.
Beispiel:
type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K]; };
Geschichte
In einem Projekt wurde zur Zeitersparnis der Standard-Partial<T> für ein tiefes Formular verwendet. Allerdings wurden die Felder der zweiten und dritten Ebene nicht optional, was zu unerwarteten Fehlern zur Laufzeit führte, wenn verschachtelte Schlüssel fehlten.
Geschichte
Es gab einen Versuch, readonly Eigenschaften nur in den untergeordneten Objekten zu entfernen, indem der mapped type nur auf die obere Ebene angewendet wurde:
type Mutable<T> = { -readonly [K in keyof T]: T[K] }
Infolgedessen blieben Felder vom Typ { readonly foo: { readonly bar: number } } in der Verschachtelung unverändert, was das Team verwirrte und die Wartung erschwerte.
Geschichte
In einem komplexen Datenmodell wurden verschachtelte mapped types zur Kombination mehrerer Hilfstypen (z. B. Readonly & Partial) verwendet. Aufgrund der falschen Reihenfolge ihrer Zusammensetzung traten unerwartete Typkompatibilitätskonflikte auf, und der Compiler begann, verwirrende Fehlermeldungen auszugeben.