programowanieFrontend Developer

Jak działa Pick w TypeScript, do czego jest ten typ narzędziowy i jaka jest jego różnica od Omit?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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.

Historia pytania

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.

Problem

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.

Rozwiązanie

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:

  • Tworzy nowy typ tylko z potrzebnymi kluczami;
  • Bardzo przydatny do typizacji zapytań select, formularzy, wyników;
  • Minimalizuje ilość ręcznego kodu i błędów podczas refaktoryzacji.

Pytania pułapki.

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.

Typowe błędy i antywzorce

  • Wymienianie w Pick wyraźnie jako ciąg znaków ("id, name"), a nie jako tablicę kluczy, co prowadzi do błędów kompilacji.
  • Wybór nieistniejących pól lub błędna autogeneracja kluczy.
  • Używanie Pick w miejscach, gdzie wymagane jest wykluczenie lub zmiana właściwości — w tym celu są Omit, Partial, Required.

Przykład z życia

Negatywny przypadek

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:

  • Wyraźny opis struktury.

Minusy:

  • Ryzyko przestarzałego typedef, duża вероятность błędów podczas refaktoryzacji.

Pozytywny przypadek

Użycie Pick do wybrania potrzebnych pól formularza:

type FormFields = Pick<User, 'email' | 'name'>;

Zmiany w User automatycznie odzwierciedlają się w formularzu.

Plusy:

  • Gwarantowana synchronizacja typów.

Minusy:

  • Należy kontrolować, aby nie wybrać zbędnych pól, które nie są obsługiwane w logice biznesowej formularza.