ProgrammierungFullstack Entwickler

Was sind 'Utility Types' in TypeScript (z.B. Partial, Required, Pick, Omit), wo und wie sollten sie angewendet werden und welche Fehler werden häufig bei ihrer Verwendung gemacht?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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 optional
  • Required<T> — macht alle Eigenschaften erforderlich
  • Pick<T, K> — wählt aus dem Typ T nur die Eigenschaften K aus
  • Omit<T, K> — schließt aus dem Typ T die Eigenschaften K aus

Anwendungsbeispiel:

type 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.

Fangfrage

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 }

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


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.