Pick vs Omit
Pick<Type, Keys> wybiera z typu tylko podane pola, a Omit<Type, Keys> kopiuje wszystkie pola oprócz podanych.
Porównanie w tabeli
#Co robi
- Pick<Type, Keys>
- Zostawia tylko wymienione pola
- Omit<Type, Keys>
- Zostawia wszystko oprócz wymienionych pól
Sprawdza, czy klucze istnieją w typie
Wynik dla typu bez wspólnych pól
- Pick<Type, Keys>
- Pusty typ
{} - Omit<Type, Keys>
- Kopia całego typu źródłowego
Reaguje na nowe pole w typie źródłowym
- Pick<Type, Keys>
- Nie dodaje go automatycznie
- Omit<Type, Keys>
- Dodaje go automatycznie
Odwrotność
- Pick<Type, Keys>
Omit- Omit<Type, Keys>
Pick
Typowe użycie
- Pick<Type, Keys>
- Publiczny widok obiektu, DTO z kilkoma polami
- Omit<Type, Keys>
- Dane formularza bez pól generowanych przez serwer
Przykład
#interface User {
id: number
name: string
passwordHash: string
}
type PublicUser = Pick<User, 'id' | 'name'>
type NewUser = Omit<User, 'id'>
const publicUser: PublicUser = { id: 1, name: 'Ania' }
const newUser: NewUser = { name: 'Kuba', passwordHash: 'xyz' }
console.log(publicUser, Object.keys(newUser)){ id: 1, name: 'Ania' } ['name', 'passwordHash']Definicja i zastosowanie
#Oba typy narzędziowe tworzą nowy typ obiektu na podstawie istniejącego, bez przepisywania go od nowa. Działają na tych samych argumentach: typie źródłowym i unii nazw pól.
Różnią się tym, które pola zostają. Pick<User, "id" | "name"> zostawia tylko wymienione pola, a wszystkie inne odpadają. Omit<User, "passwordHash"> robi odwrotnie: zostawia wszystko oprócz wymienionych pól. Pick sprawdza, że podane klucze istnieją w typie źródłowym, a Omit nie, więc literówka w nazwie pola do usunięcia nie zostanie zgłoszona przez kompilator.
Wybierz Pick, gdy łatwiej wymienić te kilka pól, które chcesz zostawić, np. do widoku publicznego profilu. Wybierz Omit, gdy łatwiej wymienić te kilka pól do usunięcia, np. dane z formularza bez pól generowanych przez serwer. Oba możesz też łączyć z przecięciem &, żeby dodać pole o innym typie.
Składnia
#type Nowy = Pick<Typ, "pole1" | "pole2">
type Inny = Omit<Typ, "pole1">Więcej przykładów
#interface Task {
id: number
title: string
}
type NewTask = Omit<Task, 'id' | 'ttile'>
const task: NewTask = { title: 'Nauka Pythona' }
console.log(task){ title: 'Nauka Pythona' }Literówka ttile nie istnieje w Task, a kompilator mimo to nic nie zgłasza, bo Omit nie sprawdza, czy podane klucze istnieją w typie źródłowym.
interface Task {
id: number
title: string
}
type TaskPreview = Pick<Task, 'id' | 'titel'>
// Błąd: Type '"titel"' does not satisfy the constraint 'keyof Task'.Dobre praktyki
#- Gdy większość pól ma zostać, a tylko kilka odpada, wybierz
Omit. Gdy zostaje tylko kilka pól, wybierzPick. - Typy wyprowadzone przez
PickiOmitsame aktualizują się po zmianie typu źródłowego, więc unikasz duplikowania definicji. - Połącz je z przecięciem
&, żeby zmienić typ jednego pola:Omit<User, "id"> & { id: string }.
Powiązane hasła
#- Pick<Type, Keys>Tworzy typ zawierający tylko wybrane właściwości innego typu.
- Omit<Type, Keys>Tworzy typ bez wybranych właściwości innego typu.
- Partial<Type>Tworzy typ, w którym wszystkie właściwości są opcjonalne.
- Przecięcie (A & B)Typ łączący wszystkie pola kilku typów jednocześnie.
- Record<Keys, Type>Tworzy typ obiektu o podanych kluczach, w którym każda wartość ma ten sam typ.
Widzisz błąd albo brakuje przykładu? Napisz do nas.