Utility Types sind integrierte Werkzeuge von TypeScript zur Transformation, Modifikation oder Ableitung von Typen basierend auf bestehenden Typen. Die häufigsten sind:
Partial<T> — macht alle Eigenschaften des Typs T optionalRequired<T> — macht alle Eigenschaften erforderlichPick<T, K> — wählt aus dem Typ T nur die Eigenschaften K ausOmit<T, K> — schließt aus dem Typ T die Eigenschaften K austype User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;
Dies ermöglicht die Erstellung flexiblerer APIs und DTOs.
Wenn eine Eigenschaft des Typs als optional angegeben ist (
age?: number), wie verhält sich dann Required<T>? Bleibt sie optional?
Antwort: Nein, Required<T> wandelt alle Eigenschaften des Typs T, einschließlich der optionalen, in erforderliche (notwendige) um.
type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }
Geschichte
Wir haben Partial<T> zur Aktualisierung von Objekten verwendet und angenommen, dass dies automatisch sicher für die Datenbank ist. Wir haben vergessen, die Felder auf null/undefined zu überprüfen und erhalten Validierungsfehler beim Aktualisieren von Entitäten.
Geschichte
Wir haben Omit<T, K> verwendet, um technische Eigenschaften aus dem Anfragetyp auszuschließen, ohne zu berücksichtigen, dass bei Refaktorierung der Modelle die neuen technischen Felder nicht in die Ausschlussliste aufgenommen wurden. Dadurch "entwichen" private Felder über die API nach außen.
Geschichte
In der Shared-Bibliothek haben wir den Typ Pick<T, K> erstellt und uns bei der Liste der Schlüssel geirrt: K fehlte teilweise im ursprünglichen Typ. TypeScript hat den Fehler bei der Verwendung von Literalzeichenfolgen übersehen, aber bei einer Änderung des ursprünglichen Typs gab es eine Inkonsistenz und Teile der Typen "brachen" in allen Diensten.