> Что такое utility types в TypeScript, например Partial и DeepPartial (TypeScript)

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

Компании: Иннотех, Инрэко, Soft_Media_Group, DigitalSail, Арго

Стек: TypeScript

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

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

Utility types в TypeScript - это встроенные generic-типы, которые упрощают манипуляции с существующими типами. Partial<T> делает все свойства типа T опциональными. DeepPartial - это рекурсивная версия Partial, которая делает опциональными свойства на всех уровнях вложенности объекта. Такие типы помогают писать более гибкий и безопасный код без ручного дублирования.

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

Utility types - это часть стандартной библиотеки TypeScript, которая предоставляет готовые инструменты для трансформации типов. Они работают на уровне системы типов и не влияют на рантайм. Partial<T> использует mapped types с модификатором ? для каждого свойства. DeepPartial не входит в стандартную библиотеку, но легко реализуется через рекурсивный mapped type. Основная цель - избежать дублирования кода и сохранить связь между исходным и производным типом.

На практике

Partial часто используется при обновлении данных, когда нужно передать только изменяемые поля. DeepPartial полезен для конфигураций с вложенными объектами или при работе с частичными ответами от API. Важно помнить, что DeepPartial может привести к потере строгости типов на глубоких уровнях, поэтому его стоит применять осознанно. В реальных проектах такие типы помогают сократить количество объявлений и улучшить читаемость.

Пример кода

TYPESCRIPT
// Встроенный Partial
interface User {
name: string;
age: number;
address: {
city: string;
zip: string;
};
}
function updateUser(id: number, updates: Partial<User>) {
// обновление только переданных полей
}
// Реализация DeepPartial
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
function updateConfig(partial: DeepPartial<Config>) {
// безопасное обновление вложенных полей
}

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

Начни с краткого определения utility types как встроенных инструментов для трансформации типов. Объясни Partial на простом примере, затем перейди к DeepPartial, подчеркнув его рекурсивную природу. Упомяни, что DeepPartial не встроен, но легко реализуется. Покажи понимание trade-off: гибкость против строгости типов. Если спросят про другие utility types, упомяни Required, Pick, Omit как смежные концепции.

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

Интервьюер оценивает понимание системы типов TypeScript, умение работать с mapped types и рекурсивными типами. Важно показать знание стандартных utility types и способность создавать свои. Проверяется практическое применение - когда и зачем использовать Partial и DeepPartial. Также оценивается понимание разницы между поверхностной и глубокой опциональностью.

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

Кандидаты часто путают Partial с Pick или думают, что Partial работает рекурсивно. Другая ошибка - считать, что utility types влияют на рантайм. Некоторые забывают, что DeepPartial нужно реализовывать вручную. Также встречается непонимание, что Partial не делает свойства undefined - он делает их опциональными, что в TypeScript не одно и то же.

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

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