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> | |
|---|---|---|
| Wymieniasz | klucze do zachowania | klucze do usunięcia |
Nowe właściwości w T | nieuwzględnione | uwzględnione automatycznie |
Nieznany klucz w K | błąd kompilacji (TS2344) | przyjęty po cichu |
| Dobre do | odpowiedzi 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.