5月27日 21:24

如何在TypeScript中处理枚举?

TypeScript中如何处理枚举?

TypeScript枚举分为数字枚举、字符串枚举和常量枚举三种。面试中重点考察它们的区别、反向映射机制以及何时该用union type替代。

数字枚举默认从0自增,支持反向映射(值→名):

typescript
enum Status { Pending, Approved, Rejected } // Status.Pending === 0, Status[0] === "Pending"

字符串枚举不支持反向映射,但可读性更好,调试时值有意义:

typescript
enum Role { Admin = "ADMIN", User = "USER" }

const enum在编译时内联,不生成JS对象,减小产物体积:

typescript
const enum Color { Red, Green, Blue } let c = Color.Red; // 编译后: let c = 0

关键区别与陷阱

  • 数字枚举有反向映射,字符串枚举没有
  • 异构枚举(数字+字符串混合)不推荐使用,TypeScript本身也会警告
  • const enum在isolatedModules模式下可能出问题,跨模块引用需谨慎
  • 枚举是运行时对象,占用JS产物体积

何时用union type替代

当值少且不需要反向映射时,union type更轻量:

typescript
type Direction = "up" | "down" | "left" | "right"

union type零运行时开销、类型安全、支持tree-shaking,是现代TS项目的首选。枚举更适合值多、需要反向映射或运行时遍历的场景。

追问

  • const enum和普通enum编译产物有什么区别?
  • 为什么字符串枚举没有反向映射?
  • keyof typeof Status能得到什么类型?
标签:TypeScript