type vs interface ·
Union Types ·
Intersection Types ·
Utility Types ·
Mapped Types ·
Conditional Types
TypeScript bietet eine Vielzahl von Möglichkeiten, Typen zu definieren und zu manipulieren. Diese Konzepte sind essenziell für die Entwicklung typisierter, flexibler und robuster Anwendungen.
interface und type sind zwei Wege, Typen in TypeScript zu definieren. Sie haben Überschneidungen, aber auch wichtige Unterschiede in der Anwendung.
| Merkmal | interface | type |
|---|---|---|
| Erweiterung | extends (mehrfach) | Intersection (&) |
| Implementierung | class implements | Nicht möglich |
| Deklarations-Merging | Ja (automatisch) | Nein |
| Union / Intersection | Nein (nur als &) | Ja (|, &) |
| Primitive Typen | Nein | Ja (type ID = string) |
| Mapped Types | Nein | Ja |
interface für Objektstrukturen, die erweitert oder von Klassen implementiert werden sollen. Verwenden Sie type für Union Types, Intersection Types, primitive Typen und Mapped Types.
Union Types erlauben einem Wert, einer von mehreren Typen zu sein. Sie werden mit dem Pipe-Operator (|) erstellt und erfordern oft Typ-Prüfungen (type guards).
kind-Eigenschaft) sind ein mächtiges Muster für die Modellierung von Zuständen und die Typsicherheit in TypeScript.
Intersection Types kombinieren mehrere Typen zu einem einzigen Typ, der alle Eigenschaften der kombinierten Typen enthält. Sie werden mit dem &-Operator erstellt.
Utility Types sind eingebaute generische Typen, die häufige Typ-Transformationen durchführen – wie das optional machen von Eigenschaften (Partial) oder das Auswählen bestimmter Schlüssel (Pick).
| Utility | Beschreibung | Beispiel |
|---|---|---|
| Partial<T> | Macht alle Eigenschaften optional | { id?: number; name?: string } |
| Required<T> | Macht alle Eigenschaften erforderlich | { id: number; name: string } |
| Readonly<T> | Macht alle Eigenschaften schreibgeschützt | { readonly id: number; readonly name: string } |
| Pick<T, K> | Wählt nur bestimmte Schlüssel aus | { name: string } |
| Omit<T, K> | Entfernt bestimmte Schlüssel | { name: string } |
| Record<K, T> | Erstellt einen Objekttyp mit Schlüsseln K | { [key: string]: User } |
| Exclude<T, U> | Entfernt Typen aus einer Union | string | number |
| Extract<T, U> | Extrahiert Typen aus einer Union | string |
| NonNullable<T> | Entfernt null und undefined | string | number |
Mapped Types durchlaufen alle Eigenschaften eines Typs und transformieren sie – z.B. um sie optional, schreibgeschützt oder umzubenennen. Sie sind die Grundlage vieler Utility Types.
Conditional Types wählen einen Typ basierend auf einer Bedingung aus – ähnlich wie ein ternärer Operator (? :) auf Typebene. Sie ermöglichen flexible und dynamische Typdefinitionen.
infer ist besonders nützlich, um Typen aus komplexen Strukturen zu extrahieren – z.B. den Rückgabetyp einer Funktion oder den Elementtyp eines Arrays.
type
|
&
Partial
keyof
extends ?
type ID = string | number ·
interface User extends Person { role: string } ·
type UserUpdate = Partial<User>