В чем разница между Literal Types и Enum в TypeScript?
Продвинутые типы
Literal types — это типы конкретных значений ('red' | 'green'), а enum — именованный набор констант, который существует и в рантайме.
Литеральные типы
type Color = 'red' | 'green' | 'blue';
const paint = (color: Color) => {};
paint('red');- Не генерируют код — после компиляции остаются обычные строки.
- Подходят для данных из API и JSON, где приходят строки.
- Отлично работают с дискриминированными объединениями.
Enum
enum Color { Red = 'red', Green = 'green' }
paint(Color.Red);- Генерирует объект в JavaScript — можно перебрать значения в рантайме.
- Числовые enum менее безопасны: в них можно передать любое значение типа
number(литерал вне enum с TS 5.0 — ошибка). - Не работает с
erasableSyntaxOnlyи запуском TS без компиляции (Node с type stripping).
Альтернатива enum
const Color = { Red: 'red', Green: 'green' } as const;
type Color = (typeof Color)[keyof typeof Color];Даёт и именованные константы, и тип-объединение, без особого синтаксиса.
Коротко для собеседования
Литералы — только типы без рантайма, enum — именованные константы с объектом в JS; сейчас чаще выбирают union литералов или as const объект.
Подробнее: TypeScript Handbook — Enums