📂 Dateien dieser Einheit:
1. 🧬 Generics <T>: Flexible & Typsichere Container
Mit Generics erstellst du Datenstrukturen und Funktionen, die mit beliebigen Typen arbeiten, ohne die Typsicherheit zu verlieren:
📊 Generic Interface: PaginiertesErgebnis<T>
interface PaginiertesErgebnis<T> {
items: T[];
total: number;
page: number;
pageSize: number;
totalPages: number;
hasNextPage: boolean;
hasPrevPage: boolean;
}
items: T[];
total: number;
page: number;
pageSize: number;
totalPages: number;
hasNextPage: boolean;
hasPrevPage: boolean;
}
// 🎯 Verwendung mit verschiedenen Datentypen:
const userPage: PaginiertesErgebnis<User> = erstellePaginiertesErgebnis(users, 100, 1, 10);
const taskPage: PaginiertesErgebnis<Task> = erstellePaginiertesErgebnis(tasks, 45, 2, 10);
2. 🔍 Type Guards & Type Narrowing
Ein Custom Type Guard (obj is TargetType) prüft zur Laufzeit Daten und versichert dem Compiler den genauen Typ:
function istAdminBenutzer(obj: any): obj is AdminBenutzer {
return (
obj !== null &&
typeof obj === "object" &&
obj.rolle === "ADMIN" &&
Array.isArray(obj.berechtigungen) &&
obj.berechtigungen.length > 0
);
}
🩻 Didaktische Analogie: Der Röntgenapparat & der Maßanzug
Type Guards sind wie der Flughafen-Röntgenapparat: Unbekannte Daten werden gründlich durchleuchtet, bevor sie in geschützte Bereiche gelassen werden. Utility Types sind wie der Präzisions-Maßanzug: Aus einem Basis-Schnittmuster schneidest du passgenau eine Weste (Pick) oder ein flexibles Übergangshemd (Partial).
📑 3. Cheat-Sheet: TypeScript Utility Types
| Utility Type | Syntax | Wirkung & Einsatzgebiet |
|---|---|---|
Partial<T> |
Partial<UserProfile> |
Alle Eigenschaften werden optional (?). Ideal für Updates. |
Readonly<T> |
Readonly<Config> |
Verhindert Überschreiben (Immutability). |
Pick<T, K> |
Pick<User, "id" | "email"> |
Wählt nur bestimmte Schlüssel aus T aus. |
Omit<T, K> |
Omit<User, "passwordHash"> |
Entfernt bestimmte Schlüssel aus T. |
Record<K, T> |
Record<string, number> |
Erstellt typisierte Key-Value Maps / Dictionaries. |