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

Как влияет на оптимизацию использование Enum или Object в TypeScript?

Продвинутые типы

Обычный enum генерирует объект в JavaScript, а `as const` объект или union литералов — либо такой же объект, либо вообще ничего. Это влияет на размер бандла и tree-shaking.

Обычный enum

enum Status { Active = 'active', Blocked = 'blocked' }

Компилируется в IIFE, которая создаёт объект. Бандлеры плохо удаляют неиспользуемые enum, а числовые enum ещё и добавляют обратное отображение.

const enum

const enum Status { Active = 'active' }

Значения подставляются прямо в код, объекта нет. Но с isolatedModules (Vite, esbuild, SWC) const enum из других файлов не работает.

Объект as const

export const Status = { Active: 'active', Blocked: 'blocked' } as const;
export type Status = (typeof Status)[keyof typeof Status];

Обычный объект: хорошо удаляется tree-shaking, работает везде.

Union литералов

type Status = 'active' | 'blocked' — после компиляции ничего не остаётся.

Итог

Разница в производительности выполнения ничтожна; важнее размер бандла, совместимость с инструментами и удобство.

Коротко для собеседования

enum генерирует объект и хуже удаляется бандлером; as const объект или union литералов легче и совместимы с любыми инструментами.

Подробнее: TypeScript Handbook — Enums vs Objects

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