PorównaniePorównania

Pick vs Omit

Pick<Type, Keys> wybiera z typu tylko podane pola, a Omit<Type, Keys> kopiuje wszystkie pola oprócz podanych.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
TypeScript
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))
Wynik
{ 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

#
Składnia
type Nowy = Pick<Typ, "pole1" | "pole2">
type Inny = Omit<Typ, "pole1">

Więcej przykładów

#
Omit nie sprawdza nazw pól
TypeScript
interface Task {
  id: number
  title: string
}

type NewTask = Omit<Task, 'id' | 'ttile'>

const task: NewTask = { title: 'Nauka Pythona' }
console.log(task)
Wynik
{ 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.

Pick sprawdza nazwy pól
TypeScript
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, wybierz Pick.
  • Typy wyprowadzone przez Pick i Omit same 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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.