Utility types — to wbudowane narzędzia TypeScript do przekształcania, modyfikowania lub uzyskiwania pochodnych typów na podstawie istniejących. Najczęściej spotykane:
Partial<T> — sprawia, że wszystkie właściwości typu T są opcjonalneRequired<T> — sprawia, że wszystkie właściwości są obowiązkowePick<T, K> — wybiera z typu T tylko właściwości KOmit<T, K> — wyklucza z typu T właściwości Ktype 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'>;
To pozwala na tworzenie bardziej elastycznych API i DTO.
Jeśli właściwość typu jest określona jako opcjonalna (
age?: number), jak będzie zachowywać się Required<T>? Czy pozostanie opcjonalna?
Odpowiedź: Nie, Required<T> przekształca wszystkie właściwości typu T, w tym opcjonalne, w obowiązkowe (wymagane).
type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }
Historia
Użyto Partial<T> do aktualizacji obiektów, zakładając, że to automatycznie jest bezpieczne dla bazy danych. Zapomniano sprawdzić pola na null/undefined i otrzymano błędy walidacji podczas aktualizacji encji.
Historia
Użyto Omit<T, K> do wykluczenia właściwości technicznych z typu zapytania, nie biorąc pod uwagę, że podczas refaktoryzacji modelu nowe właściwości techniczne nie zostały dodane do listy wykluczeń. W rezultacie prywatne pola "przeciekły" na zewnątrz przez API.
Historia
W bibliotece Shared stworzono typ Pick<T, K>, myląc się w liście kluczy: K częściowo nie było w oryginalnym typie. TypeScript pominął błąd przy użyciu dosłownych ciągów, ale przy zmianie oryginalnego typu pojawiła się niezgodność, a część typów "zepsuła się" we wszystkich serwisach.