Lektionen des Moduls (2/2)
Utility-Typen
TypeScript bietet verschiedene globale Hilfstypen (Utility Types), um gängige Typtransformationen zu erleichtern. Diese Typen sind generisch und ermöglichen es, neue Typen deklarativ aus bestehenden zu erstellen.
Die fünf am häufigsten verwendeten Hilfstypen sind:
1. Partial<T>
Macht alle Eigenschaften eines Typs T optional. Dies ist äußerst nützlich für Aktualisierungsfunktionen (Update/Patch), bei denen der Benutzer möglicherweise nur eine Teilmenge der Felder angibt:
interface User {
id: number;
name: string;
email: string;
}
// Alle Eigenschaften von User werden optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;2. Readonly<T>
Macht alle Eigenschaften eines Typs T schreibgeschützt (readonly). Jeder Versuch, eine Eigenschaft neu zuzuweisen, führt zu einem Compiler-Fehler zur Kompilierzeit:
interface Point {
x: number;
y: number;
}
const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Fehler: Sie können 'x' keine Werte zuweisen, da es sich um eine schreibgeschützte Eigenschaft handelt3. Pick<T, Keys>
Erstellt einen Typ, indem nur eine bestimmte Menge von Schlüsseln (dargestellt durch eine Union von Strings) aus dem Typ T ausgewählt wird:
interface Article {
id: number;
title: string;
content: string;
views: number;
}
// Wählt nur 'title' und 'views' aus: { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;4. Omit<T, Keys>
Erstellt einen Typ, indem eine bestimmte Menge von Schlüsseln aus dem Typ T entfernt wird. Es ist das Gegenstück zu Pick:
interface Product {
id: number;
name: string;
price: number;
secretVendorCode: string;
}
// Entfernt 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;5. Record<Keys, Type>
Erstellt einen Objekttyp, dessen Schlüssel Keys und dessen Werte vom Typ Type sind. Dies ist sehr nützlich, um Schlüssel Werten zuzuordnen, Wörterbücher oder Hash-Tabellen (Key-Value-Maps) darzustellen:
type Page = 'home' | 'about' | 'contact';
interface PageInfo {
title: string;
}
// Erstellt ein Wörterbuch mit den Schlüsseln 'home' | 'about' | 'contact' und Werten PageInfo
const nav: Record<Page, PageInfo> = {
home: { title: 'Home Page' },
about: { title: 'About Us' },
contact: { title: 'Contact Us' },
};Probier es aus
Aufgabe 1: Profilaktualisierung mit Partial
Vervollständige die Funktion updateProfile, die ein Originalprofil (Profile) und ein Aktualisierungsobjekt (updates) akzeptiert, in dem alle Felder von Profile optional sind. Sie muss ein neues Profile-Objekt zurückgeben, das die Originaleigenschaften mit den Aktualisierungen kombiniert.
Hinweis anzeigen
Verwende den Hilfstyp Partial<Profile> für den Parameter updates und den Spread-Operator, um die Objekte zusammenzuführen: { ...original, ...updates }.
Lösung nach 3 Versuchen verfügbar
Aufgabe 2: Entfernen sensibler Felder mit Omit
Definiere für den gegebenen Typ UserAccount, einen Typ-Alias namens SafeUser, der die sensible Eigenschaft passwordHash auslässt.
Hinweis anzeigen
Verwende type SafeUser = Omit<UserAccount, 'passwordHash'>;, um das angegebene Feld auszulassen.
Lösung nach 3 Versuchen verfügbar
Aufgabe 3: Öffentliche Konfiguration mit Pick und Readonly
Definiere für den gegebenen Typ AppConfig einen Typ-Alias namens PublicConfig, der eine schreibgeschützte Version (Readonly) ist und nur die über Pick ausgewählten Eigenschaften apiEndpoint und port enthält.
Hinweis anzeigen
Verwende type PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'port'>>;
Lösung nach 3 Versuchen verfügbar
Aufgabe 4: Benutzerverzeichnis mit Record und Readonly
Erstelle für ein gegebenes Interface User mit den Feldern id: number und name: string einen Typ ReadOnlyUser, der alle Felder von User schreibgeschützt macht. Erstelle anschließend einen Typ UserRegistry, der ein Wörterbuch darstellt, in dem der Schlüssel ein String (z. B. die Text-ID) und der Wert ein ReadOnlyUser ist.
Hinweis anzeigen
Verwende Readonly<User>, um ReadOnlyUser zu definieren, und Record<string, ReadOnlyUser> für das Register.
Lösung nach 3 Versuchen verfügbar