> Что такое операторы 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-значения.
Пример кода
TYPESCRIPTinterface User {id: number;name: string;email: string;role: 'admin' | 'user';createdAt: Date;}// Pick - только id и nametype UserPreview = Pick<User, 'id' | 'name'>;// Результат: { id: number; name: string }// Omit - все, кроме emailtype UserWithoutEmail = Omit<User, 'email'>;// Partial - все поля опциональныtype PartialUser = Partial<User>;// Required - все поля обязательныtype RequiredUser = Required<PartialUser>;// NonNullable - удаляем null/undefinedtype 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 работает на уровне типов, а не значений
> Похожие задачи по frontend
Что такое keyof в TypeScript и для чего он используется
Что такое generics в TypeScript и как они помогают создавать переиспользуемые компоненты?
Как работают type guards в TypeScript
Как типизировать объект с разными ключами и значениями в TypeScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью