Der Mechanismus Partial<T> wurde in TypeScript eingeführt, um die Arbeit mit Objekten zu erleichtern, deren Eigenschaften vorübergehend nicht definiert sein können. Historisch gesehen mussten Entwickler manuell neue Typen erstellen, bei denen alle Eigenschaften optional gemacht wurden, was zu Code-Duplikationen und Fehlern führte.
Ursprünglich war es erforderlich, bei der Aktualisierung oder Erstellung von Objekten mit optionalen Feldern jede optionale Eigenschaft ausdrücklich anzugeben, was unangenehm war und keine Änderungen am ursprünglichen Interface unterstützte. So entstand der Utility-Typ Partial<T>, der automatisch alle Eigenschaften des Typs T in optional umwandelt.
Beim Entwerfen von APIs ist es häufig erforderlich, nur einen Teil des Objekts zu aktualisieren, ohne die anderen Felder zu berühren. Dies ist besonders wichtig für PATCH-Anfragen, Aktualisierungsformulare und Funktionen, die nur einen Teil der Daten verarbeiten. Ohne Partial wird die Typisierung kompliziert und anfällig.
Es wird der Utility-Typ Partial<T> verwendet, der etwa so definiert ist:
// Vereinfacht: type Partial<T> = { [P in keyof T]?: T[P] };
Damit werden alle Eigenschaften optional. Beispiel:
interface User { id: number; name: string; email: string; } function updateUser(id: number, user: Partial<User>) { // ... } // Man kann nur die zu ändernde Eigenschaft übergeben updateUser(1, { email: "test@example.com" });
Wichtige Merkmale:
Kann man mit Partial alle Felder des ursprünglichen Interfaces verpflichtend machen?
Nein, Partial macht alle Eigenschaften optional. Für das umgekehrte Problem gibt es den Typ Required<T>.
Was passiert, wenn man Partial mit bereits optionalen Eigenschaften verwendet?
Partial ändert einfach die bereits optionalen Eigenschaften nicht; alle Felder bleiben optional, selbst wenn sie vor der Anwendung von Partial optional waren.
Beispiel:
interface X { x?: number; y: string; } const a: Partial<X> = {}; // Beide Eigenschaften sind jetzt optional
Kann man Partial für verschachtelte Strukturen verwenden, wenn nur die inneren Felder optional gemacht werden sollen?
Partial wird nicht rekursiv auf verschachtelte Objekte angewendet. Wenn man alle inneren Eigenschaften optional machen möchte, muss man einen eigenen generischen Typ schreiben oder externe Utilities verwenden.
In einem CRUD-System akzeptiert updateUser Partial<User> und ermöglicht die Übergabe eines leeren Objekts, was zu Laufzeitfehlern führt: Verpflichtende Felder werden gelöscht.
Vorteile:
Nachteile:
Partial<User> wird nur zur Beschreibung des Eingabeformulars für die Aktualisierung verwendet. In der letzten Phase werden alle Felder validiert und mit dem ursprünglichen Objekt zusammengeführt, bevor sie in die Datenbank übergeben werden.
Vorteile:
Nachteile: