理解枚举的局限,并用 as const 从被冻结的常量中派生出你的类型。
在 Kodokon 中打开本课enum 从语言的早期就是其组成部分,你会在很多代码库中遇到它。它把命名常量归到单一的类型下,既可以当作值使用,也可以当作类型注解。
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);
}