Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 2 von 28/14 im Kurs~15 min
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:

TS
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:

TS
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 handelt

3. 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:

TS
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:

TS
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:

TS
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

Übung#ts.m4.l2.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#ts.m4.l2.e2
Versuche: 0Wird geladen…

Definiere für den gegebenen Typ UserAccount, einen Typ-Alias namens SafeUser, der die sensible Eigenschaft passwordHash auslässt.

Editor wird geladen…
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

Übung#ts.m4.l2.e3
Versuche: 0Wird geladen…

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.

Editor wird geladen…
Hinweis anzeigen

Verwende type PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'port'>>;

Lösung nach 3 Versuchen verfügbar

Aufgabe 4: Benutzerverzeichnis mit Record und Readonly

Übung#ts.m4.l2.e4
Versuche: 0Wird geladen…

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.

Editor wird geladen…
Hinweis anzeigen

Verwende Readonly<User>, um ReadOnlyUser zu definieren, und Record<string, ReadOnlyUser> für das Register.

Lösung nach 3 Versuchen verfügbar