Утилитарный тип Pick<T, K> добавлен в TypeScript для решения задачи выборочного копирования части полей из существующего типа или интерфейса.
Часто при разработке повторно используются одни и те же структуры данных с незначительными вариациями. До появления Pick приходилось создавать новые интерфейсы, вручную копируя нужные поля, что вело к дублированию кода и ошибкам при дальнейшем изменении исходных структур.
Нужно типизировать входные или выходные данные функции, используя только часть полей большого интерфейса, чтобы избежать избыточности и максимально конкретизировать контракт.
Pick решает задачу выделения подмножества свойств типа T по ключам K:
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Пример:
interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };
Ключевые особенности:
Чем Pick отличается от Omit?
Pick выбирает только перечисленные поля типа; Omit — наоборот, исключает их из структуры.
type PartialUser = Omit<User, 'id'>; // Все поля кроме id
Можно ли с помощью Pick выбрать несуществующее свойство?
Нет, ключи K обязательно должны быть ключами исходного типа, иначе будет ошибка компиляции.
Может ли Pick влиять на опциональность или readonly поля?
Pick сохраняет модификаторы свойств (optional, readonly), если они были в исходном типе, только копирует их в новый.
При работе с формой ввода данных разработчик описал собственный тип вручную, забыв про новый обязательный атрибут, добавленный в User. Форма сломалась после обновления интерфейса.
Плюсы:
Минусы:
Используется Pick для выборки нужных полей формы:
type FormFields = Pick<User, 'email' | 'name'>;
Изменения в User автоматически отражаются в форме.
Плюсы:
Минусы: