> В чем отличие Type и Enum в TypeScript и как они выглядят после компиляции (TypeScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ЛОЦИЯ, LoyaltyLabs
Стек: TypeScript
> Пример ответа
Короткий ответ
Type (type alias) и Enum в TypeScript решают разные задачи. Type - это псевдоним для любого типа (примитив, union, intersection, object), который полностью стирается при компиляции. Enum - это перечисление констант, которое компилируется в JavaScript-объект (для числовых и строковых enum) или остаётся только в типах (для const enum). Основное отличие: type существует только на этапе типизации, enum - генерирует рантайм-значение.
Подробное объяснение
Type alias - это просто имя для типа, которое не создаёт никакого значения в рантайме. После компиляции в JavaScript все type-алиасы исчезают, так как они нужны только TypeScript-компилятору для проверки типов. Type может описывать примитивы, union-типы (string | number), intersection-типы (A & B), кортежи, маппинг и т.д.
Enum (перечисление) - это конструкция, которая вводит именованные константы. В JavaScript enum компилируется в объект с прямым и обратным отображением (для числовых enum) или просто в объект (для строковых). Это значит, что enum существует в рантайме и может использоваться как значение. Исключение - const enum, который полностью инлайнится и не генерирует объект, но его поведение ограничено.
Ключевые различия:
- Рантайм: type - нет, enum - да (кроме const enum).
- Обратимость: у числового enum есть reverse mapping (ключ по значению), у type - нет.
- Выразительность: type может описывать сложные типы (union, intersection, conditional), enum - только фиксированный набор значений.
- Использование: type - для типизации данных, enum - для набора констант, которые нужно передавать в рантайме.
На практике
На собеседовании senior-разработчика важно показать понимание trade-off между type и enum. Enum удобен, когда нужен читаемый набор констант с возможностью итерации (например, статусы заказа). Но он добавляет рантайм-нагрузку: объект enum остаётся в бандле. Type alias предпочтительнее, если константы не нужны в рантайме - это уменьшает размер кода и упрощает рефакторинг.
Для строковых enum часто лучше использовать union type с литералами: type Status = 'active' | 'inactive'. Это даёт те же проверки типов, но без рантайм-объекта. Если нужна итерация по значениям, можно создать массив констант и вывести тип из него.
Const enum - компромисс: он не генерирует объект, но может вызвать проблемы при изолированной компиляции (isolatedModules). В современных проектах (особенно с bundler'ами) const enum часто избегают.
Пример кода
TYPESCRIPT// Type alias - стирается после компиляцииtype Status = 'active' | 'inactive';type User = { name: string; status: Status };// После компиляции в JS:// (пусто, только User останется как объект, но без типа)// Enum - компилируется в объектenum StatusEnum {Active = 'active',Inactive = 'inactive'}// После компиляции:// var StatusEnum;// (function (StatusEnum) {// StatusEnum["Active"] = "active";// StatusEnum["Inactive"] = "inactive";// })(StatusEnum || (StatusEnum = {}));// Const enum - инлайнится, объекта нетconst enum ConstStatus {Active = 'active',Inactive = 'inactive'}// После компиляции: const x = "active"; // значение подставлено напрямую
Как отвечать на собеседовании
Начни с ключевого отличия: type - только для типов, enum - для рантайм-значений. Приведи пример компиляции, чтобы показать разницу. Затем объясни, когда что выбирать: для набора констант, которые нужны в коде (например, передача в API) - enum, для простых union-типов - type. Упомяни const enum и его ограничения (isolatedModules). Для senior-уровня добавь про reverse mapping у числовых enum и почему это может быть неочевидно.
Что проверяет интервьюер
- Понимание разницы между compile-time и runtime в TypeScript.
- Знание, как TypeScript-конструкции транслируются в JavaScript.
- Умение выбирать подходящий инструмент под задачу (trade-off между читаемостью, размером бандла, гибкостью).
- Осведомлённость о const enum и его подводных камнях.
- Способность объяснить reverse mapping и его влияние на производительность.
Типичные ошибки
- Утверждение, что type alias генерирует какой-либо код в рантайме.
- Игнорирование reverse mapping у числовых enum (думают, что только строковые).
- Использование enum для простых union-типов без необходимости в рантайме.
- Забывают про const enum и его ограничения (особенно при работе с isolatedModules).
- Путают enum с объектами: думают, что enum можно спредом или деструктуризировать как обычный объект (на самом деле это не рекомендуется, хотя технически возможно).
> Похожие задачи по frontend
Что такое дженерики в TypeScript и для чего они используются
В чем разница между типами void и never в TypeScript
Можно ли создать два интерфейса или типа с одинаковым именем, но разным описанием в TypeScript
Что такое интерфейсы и типы в TypeScript, для чего они нужны и чем отличаются?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью