W tym wpisie przedstawię niektóre z utility types w Typescript które pomagają wykrywać błędy już na etapie pisania kodu, a nie dopiero w czasie jego uruchamiania.
Wbudowane Utility Types pomagają:
- ograniczyć duplikację kodu,
- poprawić czytelność,
- zwiększyć bezpieczeństwo typów,
- szybciej reagować na zmiany w modelach danych.
W tym wpisie pokażę 6 najczęściej używanych Utility Types wraz z praktycznymi przykładami:
- Partial
- Pick
- Omit
- ReturnType
- Extract
- Exclude
Przykładowy model danych
W przykładach posłużymy się prostym modelem użytkownika:
export interface User {
id: number;
name: string;
email: string;
password: string;
role: "admin" | "user" | "guest";
}Partial – wszystkie pola opcjonalne
Partial<T> zamienia wszystkie właściwości typu na opcjonalne.
Zastosowanie
- formularze edycji,
- aktualizacja danych (
PATCH), - obiekty konfiguracyjne.
type UserUpdate = Partial<User>;
const updateUser = (data: UserUpdate) => {
// możemy przekazać tylko część pól
};
updateUser({
email: "nowy@email.pl"
});
Pick<T, K> – wybór konkretnych pól
Pick<T, K> pozwala wybrać tylko wskazane właściwości z danego typu.
Zastosowanie
- DTO,
- dane publiczne,
- ograniczanie zakresu danych.
type UserPreview = Pick<User, "id" | "name">;
const user: UserPreview = {
id: 1,
name: "Kamil"
};
Omit<T, K> – usunięcie wybranych pól
Omit<T, K> działa odwrotnie do Pick — usuwa wskazane właściwości.
Zastosowanie
- usuwanie wrażliwych danych (np. hasła),
- tworzenie bezpiecznych obiektów do API.
type SafeUser = Omit<User, "password">;
const safeUser: SafeUser = {
id: 1,
name: "Kamil",
email: "kamil@email.pl",
role: "admin"
};
ReturnType<T> – automatyczne wnioskowanie typu zwracanego
ReturnType<T> pobiera typ zwracany przez funkcję.
Zastosowanie
- refaktoryzacja,
- unikanie ręcznego definiowania typów,
- spójność między funkcjami.
function getUser() {
return {
id: 1,
name: "Kamil",
role: "admin" as const
};
}
type GetUserResult = ReturnType<typeof getUser>;Jeśli zmieni się implementacja funkcji, typ zmieni się automatycznie.
Extract<T, U> – wybór pasujących typów z unii
Extract<T, U> wyciąga wspólne elementy z typów unijnych.
Zastosowanie
- systemy uprawnień.
- filtrowanie ról,
- typy warunkowe.
type Roles = "admin" | "user" | "guest";
type AdminRoles = Extract<Roles, "admin" | "superadmin">;
// wynik: "admin"
Exclude<T, U> – usuwanie typów z unii
Exclude<T, U> usuwa określone typy z unii.
Zastosowanie
- walidacja danych.
- ograniczanie dostępu,
- logika biznesowa.
type Roles = "admin" | "user" | "guest";
type NonAdminRoles = Exclude<Roles, "admin">;
// wynik: "user" | "guest"
Podsumowanie
Utility Types w TypeScript to potężne narzędzia, które:
- zwiększają bezpieczeństwo kodu,
- redukują ilość ręcznie pisanych typów,
- poprawiają czytelność i skalowalność projektu.
Mam nadzieję, że te przykłady okażą się dla Was pomocne i pozwolą szybciej oraz bezpieczniej pracować z typami w TypeScript.
