Typ narzędziowy Pick<T, K> został dodany do TypeScript w celu rozwiązania problemu selektywnego kopiowania części pól z istniejącego typu lub interfejsu.
Często podczas rozwoju ponownie wykorzystuje się te same struktury danych z niewielkimi wariacjami. Przed wprowadzeniem Pick konieczne było tworzenie nowych interfejsów, ręczne kopiowanie wymaganych pól, co prowadziło do duplikacji kodu i błędów podczas dalszych zmian w pierwotnych strukturach.
Należy typizować dane wejściowe lub wyjściowe funkcji, wykorzystując tylko część pól dużego interfejsu, aby uniknąć nadmiarowości i maksymalnie sprecyzować kontrakt.
Pick rozwiązuje problem wydzielania podzbioru właściwości typu T według kluczy K:
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Przykład:
interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };
Kluczowe cechy:
Czym Pick różni się od Omit?
Pick wybiera tylko wymienione pola typu; Omit — przeciwnie, wyklucza je z struktury.
type PartialUser = Omit<User, 'id'>; // Wszystkie pola oprócz id
Czy można przy pomocy Pick wybrać nieistniejącą właściwość?
Nie, klucze K muszą koniecznie być kluczami pierwotnego typu, w przeciwnym razie wystąpi błąd kompilacji.
Czy Pick może wpływać na opcjonalność lub pola readonly?
Pick zachowuje modyfikatory właściwości (opcjonalne, readonly), jeśli były w pierwotnym typie, po prostu kopiuje je do nowego.
Podczas pracy z formularzem wejściowym programista ręcznie opisał własny typ, zapominając o nowym obowiązkowym atrybucie, który został dodany w User. Formularz zepsuł się po aktualizacji interfejsu.
Plusy:
Minusy:
Użycie Pick do wybrania potrzebnych pól formularza:
type FormFields = Pick<User, 'email' | 'name'>;
Zmiany w User automatycznie odzwierciedlają się w formularzu.
Plusy:
Minusy: