Перейти к содержимому

Enums vs Union of literals

Holy war на интервью. После TS 5.x команда официально не рекомендует numeric/regular enum в новых проектах: генерируется runtime-код, плохо tree-shake’ится, не работает с isolatedModules у const enum. Альтернатива — union of literals + as const-объект. Красный флаг — не знать различий numeric vs string vs const enum.

Регулярный enum vs union:

// Старый стиль: numeric enum (генерирует объект в runtime)
enum RoleEnum { Admin, Editor, Viewer } // 0,1,2 — ловушка совместимости
// Идиоматично сегодня
type Role = 'admin' | 'editor' | 'viewer';
// Если нужен runtime-объект — as const
const Role = {
Admin: 'admin',
Editor: 'editor',
Viewer: 'viewer',
} as const;
type RoleT = typeof Role[keyof typeof Role]; // 'admin'|'editor'|'viewer'

String enum безопаснее numeric, но всё равно генерирует код и не дружит с isolatedModules:

enum Status { Ok = 'OK', Err = 'ERR' } // ок, но runtime-объект остаётся
// const enum инлайнится, но требует preserveConstEnums/isolatedModules-нюансов:
const enum HttpCode { Ok = 200, NotFound = 404 }
const c = HttpCode.Ok; // в коде: const c = 200;

Итог: В новых проектах предпочитай union of literals (+ as const-объект, если нужен runtime). Enum — только если стайлгайд требует.