> Что такое 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 с enum
enum 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)

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

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