Разберись в ограничениях enum и выводи свои типы из замороженных констант с помощью as const.
Открыть этот урок в Kodokonenum есть в языке с самых первых версий, и ты встретишь его во множестве проектов. Он собирает именованные константы под одним типом, который годится и как значение, и как аннотация.
enum Role {
User = "USER",
Admin = "ADMIN",
}
function canDelete(role: Role): boolean {
return role === Role.Admin;
}И всё же современная экосистема от него уходит. enum - это синтаксис, которого нет в JavaScript: компилятор порождает объект во время выполнения, что усложняет работу некоторых инструментов и несовместимо с опцией erasableSyntaxOnly. Альтернатива: обычный объект, замороженный через as const, из которого ты выводишь тип.
const ROLES = {
User: "USER",
Admin: "ADMIN",
} as const;
type Role = (typeof ROLES)[keyof typeof ROLES];
function canDelete(role: Role): boolean {
return role === ROLES.Admin;
}as const работает и с массивами: каждый элемент становится литералом только для чтения, а (typeof SIZES)[number] даёт объединение значений. Один источник истины питает и работающий код, и типы.
const SIZES = ["sm", "md", "lg"] as const;
type Size = (typeof SIZES)[number];
function isSize(value: string): value is Size {
return (SIZES as readonly string[]).includes(value);
}