Весной стартует сезон найма, успей отхватить свой оффер!

Utility Type Pick в TypeScript

Pick — это utility тип в TypeScript, который позволяет «выбрать» конкретные свойства из существующего типа или интерфейса. Он создаёт новый тип, включающий лишь те поля, которые вы явно указали.

Синтаксис

Pick<T, K>
  • T - исходный тип или интерфейс, из которого нужно выбрать свойства.
  • K — объединение (union) ключей, которые вы хотите оставить в результирующем типе.

Pick берёт только перечисленные свойства K из T, а все остальные игнорирует.

Когда использовать Pick?

  • Если нужно создать новый объектный тип с ограниченным числом свойств.
  • Для API-запросов, когда не требуется отправлять все данные.
  • В React-пропсах, когда компоненту нужен только определенный набор данных.

Пример использования Pick

Допустим, у нас есть интерфейс User с несколькими полями:

interface User {
  id: number;
  name: string;
  age: number;
  isAdmin: boolean;
}

Если нам нужен тип, в котором мы хотим хранить только id и name, мы можем воспользоваться Pick:

type BasicUserInfo = Pick<User, "id" | "name">;

const userInfo: BasicUserInfo = {
    id: 1,
    name: "Alice",
};

userInfo.age = 25;       
// Ошибка: свойство 'age' отсутствует в типе 'Pick<User, "id" | "name">'
  • BasicUserInfo содержит только поля id и name.
  • Попытка обратиться к age или isAdmin приведёт к ошибке на этапе компиляции, так как их нет в результирующем типе.

Пример с API

При получении данных о пользователе из API иногда хочется вернуть наружу только минимальный набор полей, не раскрывая всего внутреннего устройства объекта. Например:

interface User {
    id: number;
    name: string;
    email: string;
    passwordHash: string;
    isAdmin: boolean;
}

// Создадим публичный профиль (только безопасная часть данных)
type PublicUserProfile = Pick<User, "id" | "name">;

function getPublicProfile(user: User): PublicUserProfile {
    return {
        id: user.id,
        name: user.name,
    };
}

Таким образом, функция getPublicProfile возвращает только те поля id и name, которые мы явно указали в PublicUserProfile.


Зачем нужен Pick?

  • Сокращение типов: Если вы работаете с большим интерфейсом, а в определённом контексте вам нужны только несколько свойств, Pick позволяет избежать дублирования кода при определении типов, повторно используя существующие структуры.
  • Гибкость: Позволяет динамически переиспользовать общие структуры данных (например, при работе с API), выбирая только нужные поля для определённой операции.
  • Контроль: Избегаете случайной передачи лишних данных или нежелательных свойств.

Сравнение с Omit

УтилитаОписание
Pick<T, K>Оставляет только указанные свойства K из T
Omit<T, K>Исключает указанные свойства K из T, оставляя остальные

Итог

  • Pick помогает формировать подтипы, оставляя только нужные свойства.
  • Уменьшает дублирование кода и снижает риск ошибок при передаче данных.
  • В сочетании с Omit и другими утилитами делает код гибче и безопаснее.