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 constconst 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 — только если стайлгайд требует.