Как влияет на оптимизацию использование 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