Menu

Pick w TypeScript: wybieranie właściwości z typu (przykłady)

Pick<T, K> tworzy typ zawierający tylko te właściwości T, których klucze są w K. Zobacz Pick z jednym lub kilkoma kluczami, jak sprawdza klucze, Pick a Omit, wybieranie z typów zagnieżdżonych, otypowaną funkcję pick() i wybieranie właściwości według typu wartości.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Pick<T, K> to wbudowany typ narzędziowy, który tworzy typ obiektowy zawierający tylko właściwości T wymienione w K. Używaj go, gdy funkcja lub komponent potrzebuje kilku pól większego typu:

renderPreview przyjmuje pełnego User, ale też zwykły obiekt { id, name }, bo prosi tylko o to, czego używa. Dzięki temu łatwiej ją wywołać i przetestować. Pick działa tylko na typach: pełny obiekt ada w czasie działania nadal ma wszystkie pięć właściwości.

Składnia i sprawdzanie kluczy

Pick<Type, Keys>

Keys to pojedynczy klucz lub unia kluczy, a każdy musi istnieć w Type. Definicja w bibliotece standardowej TypeScriptu zapisuje to jako ograniczenie:

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

Dzięki K extends keyof T błędnie wpisany lub nieistniejący klucz to błąd kompilacji, a edytor może podpowiadać nazwy kluczy:

Błąd to error TS2344: Type '"cost"' does not satisfy the constraint 'keyof Product'. To różnica względem Omit, którego klucze nie są sprawdzane.

Pick zachowuje readonly i opcjonalność

Pick mapuje po kluczach T, więc każda wybrana właściwość zachowuje swoje modyfikatory:

Ostatnia linia pokazuje { id: 8 }, bo readonly to tylko sprawdzenie podczas kompilacji: przypisanie zostało zgłoszone, wyciszone przez @ts-expect-error i mimo to wykonane. Aby zmienić modyfikatory przy wybieraniu, opakuj wynik: Partial<Pick<Account, "plan">> albo Required<Pick<Account, "email">>.

Pick a Omit

Pick wymienia, co zachować; Omit wymienia, co odrzucić. Dziś oba dają ten sam wynik, ale zachowują się inaczej, gdy typ źródłowy się rozrasta:

Pick<T, K>Omit<T, K>
Wymieniaszklucze do zachowaniaklucze do usunięcia
Nowe właściwości w Tnieuwzględnioneuwzględnione automatycznie
Nieznany klucz w Kbłąd kompilacji (TS2344)przyjęty po cichu
Dobre doodpowiedzi API, widoków publicznych, propsów"wszystko poza sekretem"

Dla danych, które opuszczają twój serwer, Pick to bezpieczniejszy wybór domyślny: nic nie pojawi się w typie, jeśli ktoś celowo tego nie doda.

Wybieranie z typów zagnieżdżonych

Pick widzi tylko klucze najwyższego poziomu: ścieżka z kropką, taka jak Pick<Customer, "address.city">, to błąd (TS2344), a nie zagnieżdżony wybór. Użyj indexed access type, żeby sięgnąć do zagnieżdżonego typu, i wybieraj z niego:

Customer["address"] to typ właściwości address. Ta sama składnia sięga do elementów tablicy: dla właściwości orders: Order[] Customer["orders"][number] to Order.

Otypowana funkcja pick()

Pick nic nie robi w czasie działania. Mała funkcja generyczna kopiuje wybrane właściwości do nowego obiektu i zwraca dokładnie Pick<T, K>:

K extends keyof T pozwala TypeScriptowi wywnioskować K z argumentów tekstowych, więc typ zwracany ma dokładnie wybrane klucze. Asercja {} as Pick<T, K> jest potrzebna, bo pusty obiekt jeszcze nie ma tych właściwości; pętla je uzupełnia.

Wybieranie właściwości według typu wartości

Pick wybiera po nazwie klucza. Aby wybierać według typu właściwości, na przykład "wszystkie pola tekstowe", napisz typ mapowany z filtrem kluczy:

Klauzula as mapuje każdy klucz na niego samego, gdy jego typ pasuje, a w przeciwnym razie na never, a klucze never są odrzucane. Jeden niuans: typ właściwości opcjonalnej zawiera undefined, więc opcjonalne subtitle?: string nie liczyłoby się tu jako string; testuj względem string | undefined, żeby je uwzględnić.

Najczęściej zadawane pytania

Co robi Pick w TypeScript?

Pick<T, K> buduje typ obiektowy zawierający tylko te właściwości T, których klucze są w K. Pick<User, "id" | "name"> to { id: number; name: string }, gdy User ma te dwie właściwości i inne. Działa tylko na typach i niczego nie usuwa z obiektów w czasie działania.

Czym różni się Pick od Omit?

Pick wymienia właściwości do zachowania, Omit te do usunięcia. Gdy typ źródłowy zyska nową właściwość, Omit automatycznie ją uwzględni, a Pick nie. Pick sprawdza też, czy jego klucze istnieją w typie; Omit przyjmuje dowolny klucz.

Jak wybrać kilka właściwości w TypeScript?

Przekaż unię kluczy: Pick<User, "id" | "name" | "email">. Wszystkie klucze muszą istnieć w User, inaczej kompilator zgłosi błąd TS2344.

Jak wybrać zagnieżdżoną właściwość w TypeScript?

Pick wybiera tylko właściwości najwyższego poziomu. Sięgnij do zagnieżdżonego typu przez indexed access type i wybieraj z niego: Pick<User["address"], "city">. Aby zachować zagnieżdżenie, połącz je: Pick<User, "id"> & { address: Pick<User["address"], "city"> }.

Czy Pick zachowuje modyfikatory readonly i opcjonalności?

Tak. Pick to typ mapowany po kluczach T, więc właściwość, która w T jest readonly lub opcjonalna, pozostaje taka w wybranym typie.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ