> Что такое Record в TypeScript и как его использовать? (TypeScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: TYMY
Стек: TypeScript
> Пример ответа
Короткий ответ
Record<K, V> - это встроенный utility type в TypeScript, который создаёт объектный тип с ключами типа K и значениями типа V. Он упрощает описание словарей или маппингов, где все ключи однотипны, а значения имеют фиксированный тип. Используется для типизации объектов с динамическими, но ограниченными ключами, например, Record<string, number>.
Подробное объяснение
Record - это generic-тип, принимающий два параметра: тип ключей (K) и тип значений (V). K должен быть assignable к string | number | symbol, так как это ограничение для ключей объекта в JavaScript. Record гарантирует, что все ключи из K присутствуют в объекте и имеют тип V.
Основные сценарии использования:
- Типизация конфигураций или словарей с фиксированным набором ключей
- Создание маппингов между enum и данными
- Описание ответов от API с динамическими ключами, но известной структурой значений
Record отличается от обычного индексного типа { [key: string]: V } тем, что явно перечисляет допустимые ключи, что даёт лучшую проверку типов и автодополнение в IDE.
На практике
Record часто применяется для:
- Типизации аргументов функций, принимающих объекты с известными ключами
- Описания состояний UI (например,
Record<Status, string>) - Создания lookup-таблиц для маппинга значений
- Комбинирования с Partial, Required или Pick для гибкой работы с объектами
При использовании Record с union-типом ключей TypeScript проверяет, что все ключи из union присутствуют в объекте. Это помогает избежать ошибок, связанных с отсутствующими полями.
Пример кода
TYPESCRIPT// Простой пример: маппинг статусов на цветаtype Status = 'success' | 'error' | 'warning';const statusColors: Record<Status, string> = {success: '#4CAF50',error: '#F44336',warning: '#FF9800'};// Record с динамическими ключамиconst userScores: Record<string, number> = {alice: 95,bob: 87,charlie: 92};// Record с enumenum Direction {Up = 'UP',Down = 'DOWN',Left = 'LEFT',Right = 'RIGHT'}const directionLabels: Record<Direction, string> = {[Direction.Up]: 'Вверх',[Direction.Down]: 'Вниз',[Direction.Left]: 'Влево',[Direction.Right]: 'Вправо'};// Record с Partial для опциональных полейtype ConfigKey = 'theme' | 'language' | 'notifications';const userConfig: Partial<Record<ConfigKey, string>> = {theme: 'dark',language: 'ru'};
Как отвечать на собеседовании
Начни с краткого определения Record как утилиты для создания объектных типов. Приведи простой пример с union-типом ключей. Объясни разницу между Record и индексной сигнатурой: Record требует явного перечисления ключей, что даёт type safety. Упомяни ограничение K extends string | number | symbol. Покажи, как Record комбинируется с другими utility types. Если спросят про альтернативы, скажи, что для сложных структур лучше использовать interface или type с явными полями.
Что проверяет интервьюер
- Понимание generic-типов и utility types в TypeScript
- Знание ограничений на типы ключей в объектах
- Умение выбирать подходящий инструмент для типизации словарей
- Понимание разницы между Record и индексными сигнатурами
- Способность комбинировать Record с другими типами
Типичные ошибки
- Использование Record с типами, недопустимыми для ключей (например,
Record<boolean, string>) - Забывание, что Record требует все ключи из union, что может привести к ошибкам при неполном объекте
- Путаница с
Map<K, V>: Record - это объектный тип, Map - это класс с методами - Излишнее использование Record для простых объектов с фиксированными полями, где лучше подходит interface
- Неправильное указание типа значений, когда значения могут быть разных типов (тогда нужен union или discriminated union)
> Похожие задачи по frontend
Можно ли объединить несколько типов в один тип в TypeScript и как это сделать?
Какие альтернативы использованию infer в TypeScript для типизации ключей?
Что такое Pick в TypeScript и как его использовать?
Нужно ли добавлять Promise к выходному типу асинхронной функции в TypeScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью