> Что такое операторы Pick, Partial, Omit, Required, NonNullable и Exclude в TypeScript (TypeScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: IT-One, intelsy

Стек: TypeScript

> Пример ответа

Короткий ответ

Pick, Partial, Omit, Required, NonNullable и Exclude - это встроенные утилитарные типы TypeScript для трансформации типов. Pick и Omit выбирают или исключают ключи из объекта. Partial и Required делают все поля опциональными или обязательными. NonNullable удаляет null и undefined из union-типа. Exclude исключает определённые значения из union-типа. Все они работают на уровне типов, без влияния на рантайм.

Подробное объяснение

Эти утилиты входят в стандартную библиотеку TypeScript и помогают создавать новые типы на основе существующих без дублирования кода. Рассмотрим каждую:

  • Pick<T, K> - создаёт тип, выбирая только указанные ключи K из типа T. Полезно, когда нужно взять подмножество полей объекта.

  • Partial - делает все поля типа T опциональными (добавляет ? к каждому свойству). Часто используется для обновления части данных.

  • Omit<T, K> - противоположность Pick: исключает указанные ключи K из типа T. Удобно, когда нужно убрать определённые поля.

  • Required - делает все поля типа T обязательными (убирает ?). Полезно, когда нужно гарантировать наличие всех свойств.

  • NonNullable - исключает null и undefined из union-типа T. Например, NonNullable<string | null | undefined> даст string.

  • **Exclude<T, U>** - исключает из union-типа T все типы, которые можно присвоить типу U. Например, Exclude<'a' | 'b' | 'c', 'a'>даст'b' | 'c'`.

Все эти утилиты реализованы через условные типы и mapped types внутри TypeScript. Они не генерируют JavaScript-код - работают только на этапе компиляции.

На практике

Эти утилиты постоянно используются в реальных проектах. Например, при работе с формами часто нужен Partial для типов данных, чтобы создавать частичные обновления. Pick и Omit помогают создавать DTO (Data Transfer Objects) без лишних полей. NonNullable пригождается при обработке данных из API, где могут приходить null-значения.

Пример кода

TYPESCRIPT
interface User {
id: number;
name: string;
email: string;
role: 'admin' | 'user';
createdAt: Date;
}
// Pick - только id и name
type UserPreview = Pick<User, 'id' | 'name'>;
// Результат: { id: number; name: string }
// Omit - все, кроме email
type UserWithoutEmail = Omit<User, 'email'>;
// Partial - все поля опциональны
type PartialUser = Partial<User>;
// Required - все поля обязательны
type RequiredUser = Required<PartialUser>;
// NonNullable - удаляем null/undefined
type Status = 'active' | 'inactive' | null | undefined;
type CleanStatus = NonNullable<Status>; // 'active' | 'inactive'
// Exclude - исключаем конкретные значения
type Roles = 'admin' | 'user' | 'guest';
type AdminOnly = Exclude<Roles, 'user' | 'guest'>; // 'admin'

Как отвечать на собеседовании

Начни с краткого определения каждой утилиты. Приведи пример использования из реальной практики - например, как Partial помогает при обновлении данных через PATCH-запрос. Покажи понимание разницы между Pick/Omit и Partial/Required. Упомяни, что это compile-time конструкции, не влияющие на производительность. Если спросят про реализацию, скажи, что они основаны на mapped types и conditional types.

Что проверяет интервьюер

  • Понимание системы типов TypeScript и её возможностей
  • Умение работать с утилитарными типами для трансформации данных
  • Знание разницы между операциями на уровне типов и значений
  • Способность применять эти утилиты в реальных сценариях

Типичные ошибки

  • Путаница между Pick и Omit (какой что делает)
  • Использование Partial для типов, где нужны только некоторые поля (лучше Pick)
  • Забывание, что NonNullable работает только с union-типами, а не с объектами
  • Попытка использовать эти утилиты в рантайме (они не существуют в JavaScript)
  • Неправильное понимание, что Exclude работает на уровне типов, а не значений

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью