ПрограммированиеFrontend разработчик

Как работает Pick в TypeScript, для чего нужен этот утилитарный тип, и в чем его отличие от Omit?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Утилитарный тип 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", };

Ключевые особенности:

  • Формирует новый тип с только нужными ключами;
  • Очень удобен для типизации select-запросов, форм, выдач;
  • Минимизирует количество ручного кода и ошибок при рефакторе.

Вопросы с подвохом.

Чем Pick отличается от Omit?

Pick выбирает только перечисленные поля типа; Omit — наоборот, исключает их из структуры.

type PartialUser = Omit<User, 'id'>; // Все поля кроме id

Можно ли с помощью Pick выбрать несуществующее свойство?

Нет, ключи K обязательно должны быть ключами исходного типа, иначе будет ошибка компиляции.

Может ли Pick влиять на опциональность или readonly поля?

Pick сохраняет модификаторы свойств (optional, readonly), если они были в исходном типе, только копирует их в новый.

Типовые ошибки и анти-паттерны

  • Перечисление в Pick явно строкой ("id, name"), а не массивом ключей, что приводит к ошибкам компиляции.
  • Выбор несуществующих полей или неправильная автогенерация ключей.
  • Использование Pick там, где требуется исключение или изменение свойств — для этого есть Omit, Partial, Required.

Пример из жизни

Негативный кейс

При работе с формой ввода данных разработчик описал собственный тип вручную, забыв про новый обязательный атрибут, добавленный в User. Форма сломалась после обновления интерфейса.

Плюсы:

  • Явное описание структуры.

Минусы:

  • Риск устаревания typedef, высокая вероятность багов при рефакторинге.

Позитивный кейс

Используется Pick для выборки нужных полей формы:

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

Изменения в User автоматически отражаются в форме.

Плюсы:

  • Гарантированная синхронизация типов.

Минусы:

  • Нужно контролировать, чтобы не выбрать лишние поля, которые не поддерживаются в бизнес-логике формы.