5月27日 21:24
如何在TypeScript中处理枚举?
TypeScript中如何处理枚举?
TypeScript枚举分为数字枚举、字符串枚举和常量枚举三种。面试中重点考察它们的区别、反向映射机制以及何时该用union type替代。
数字枚举默认从0自增,支持反向映射(值→名):
typescriptenum Status { Pending, Approved, Rejected } // Status.Pending === 0, Status[0] === "Pending"
字符串枚举不支持反向映射,但可读性更好,调试时值有意义:
typescriptenum Role { Admin = "ADMIN", User = "USER" }
const enum在编译时内联,不生成JS对象,减小产物体积:
typescriptconst enum Color { Red, Green, Blue } let c = Color.Red; // 编译后: let c = 0
关键区别与陷阱
- 数字枚举有反向映射,字符串枚举没有
- 异构枚举(数字+字符串混合)不推荐使用,TypeScript本身也会警告
- const enum在isolatedModules模式下可能出问题,跨模块引用需谨慎
- 枚举是运行时对象,占用JS产物体积
何时用union type替代
当值少且不需要反向映射时,union type更轻量:
typescripttype Direction = "up" | "down" | "left" | "right"
union type零运行时开销、类型安全、支持tree-shaking,是现代TS项目的首选。枚举更适合值多、需要反向映射或运行时遍历的场景。
追问
- const enum和普通enum编译产物有什么区别?
- 为什么字符串枚举没有反向映射?
keyof typeof Status能得到什么类型?