PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые типы

В чем разница между 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

Другие вопросы раздела