Lektionen des Moduls (2/2)
Gemappte Typen
Mappierte Typen (Mapped Types) ermöglichen es, neue Typen aus bestehenden Typen zu erstellen, indem Eigenschaften einzeln transformiert werden. Sie basieren auf der Syntax von Schleifen über Schlüssel unter Verwendung des Operators keyof.
type Mapped<T> = {
[P in keyof T]: T[P];
};Dieses Beispiel ist ein mappierter Typ, der mit dem Original identisch ist: Er durchläuft jeden Schlüssel P in keyof T und weist ihm denselben Typ T[P] zu.
Modifikatoren für Mutabilität und Optionalität
Wir können Modifikatoren wie readonly und ? (Optionalität) hinzufügen oder entfernen, indem wir + (hinzufügen, Standard) oder - (entfernen) voranstellen.
Um beispielsweise die Optionalität von allen Eigenschaften eines Typs zu entfernen (sie also zu Pflichtfeldern zu machen):
type Concrete<T> = {
[P in keyof T]-?: T[P];
};Der Modifikator -? entfernt das Optionalitäts-Flag von jeder Eigenschaft.
Neuzuordnung von Schlüsseln mit as
In TypeScript 4.1+ ist es möglich, die Schlüssel eines mappierten Typs mithilfe der as-Klausel und Template-Literal-Typen neu zuzuordnen.
type ScriviSetters<T> = {
[K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};Hier ändern wir den Namen jeder Eigenschaft K in set[GroßgeschriebenerSchlüssel] und ändern ihren Typ in eine Setter-Funktion.
Probier es aus
Aufgabe 1: Eigenschaften nullwertfähig machen
Deklariere einen generischen mappierten Typ Nullable<T>, der ein Objekt T nimmt und jede seiner Eigenschaften so transformiert, dass sie auch den Wert null akzeptieren kann (z. B. T[K] | null).
Hinweis anzeigen
Verwende die Syntax [K in keyof T]: T[K] | null; innerhalb des mappierten Typs.
Lösung nach 3 Versuchen verfügbar
Aufgabe 2: Dynamische Getters mit as generieren
Erstelle einen mappierten Typ namens GetterNames<T>, der die Schlüssel des Objekts T transformiert, indem er das Präfix 'get' hinzufügt und den ursprünglichen Schlüssel großschreibt (verwende Capitalize). Wenn beispielsweise ein Schlüssel name ist, wird er zu getName. Setze den Typ der Eigenschaften auf () => T[K].
Hinweis anzeigen
Verwende as \`get\${Capitalize<string & K>}\`, um den Schlüssel neu zuzuordnen, und () => T[K] als Rückgabetyp der Eigenschaft.
Lösung nach 3 Versuchen verfügbar