文章目录

TypeScript 枚举:enum 类型的定义与使用

发布于 2026-04-18 10:15:04 · 浏览 13 次 · 评论 0 条

TypeScript 枚举:enum 类型的定义与使用

枚举是 TypeScript 中一种特有的数据结构,它允许开发者定义一组具名的常量。使用枚举可以显著提高代码的可读性,避免使用“魔术数字”或难以记忆的字符串,让代码逻辑更加清晰。

1. 定义数字枚举

数字枚举是 TypeScript 中默认的枚举类型。如果不指定初始值,枚举成员的值会从 0 开始自动递增。

  1. 使用 enum 关键字定义一个名为 Direction 的枚举。
  2. 列出枚举成员,如 UpDownLeftRight
  3. 访问枚举成员,通过点号语法获取其对应的数值。
enum Direction {
  Up,    // 默认值为 0
  Down,  // 默认值为 1
  Left,  // 默认值为 2
  Right  // 默认值为 3
}

// 输出: 0
console.log(Direction.Up);

2. 设置数字枚举的初始值

开发者可以手动指定枚举成员的数值,未被指定的成员会根据前一个值自动递增。

  1. 定义枚举时,第一个成员后使用等号 赋值
  2. 观察后续成员的数值变化,它们将基于初始值自动递增。
enum Status {
  Success = 200,
  NotFound = 404,
  ServerError // 自动递增为 405
}

// 输出: 405
console.log(Status.ServerError);

3. 理解数字枚举的反向映射

数字枚举的一个强大特性是支持反向映射:即可以通过值获取到键名。

  1. 定义一个数字枚举 EnumRole
  2. 使用枚举名作为对象,传入数值作为键。
  3. 获取对应的成员名称。
enum EnumRole {
  Admin = 1,
  User = 2
}

// 正向映射:值
console.log(EnumRole.Admin); // 输出: 1

// 反向映射:键名
console.log(EnumRole[1]);    // 输出: "Admin"

4. 定义字符串枚举

字符串枚举要求每个成员都必须用字符串字面量进行初始化,不支持自增,也不支持反向映射。这种类型常用于需要明确语义的场景(如 API 请求参数)。

  1. 声明枚举成员,并赋予其字符串字面量。
  2. 确保所有成员都有明确的字符串值。
enum MediaType {
  JSON = "application/json",
  XML = "application/xml",
  FORM = "multipart/form-data"
}

// 输出: "application/json"
console.log(MediaType.JSON);

5. 使用常量枚举

为了优化性能,减少编译后的代码量,可以使用 const 关键字定义常量枚举。常量枚举在编译阶段会被完全删除,使用处会被内联替换为常量值。

  1. enum 关键字前添加 const 修饰符。
  2. 编写枚举定义。
  3. 注意:常量枚举不能包含计算成员。
const enum Align {
  Left,
  Right,
  Center
}

// 编译后的代码类似: let align = 0; (Align.Left 被替换)
let align = Align.Left;

6. 枚举作为类型使用

枚举不仅仅可以存储值,还可以直接作为类型注解使用,从而限制变量的取值范围。

  1. 定义一个枚举 Color
  2. 声明变量时,使用 Color 作为类型。
  3. 赋值时,变量只能是 Color 中的成员之一,否则 TypeScript 会报错。
enum Color {
  Red,
  Green,
  Blue
}

let c: Color;

c = Color.Red;     // 正确
c = Color.Green;   // 正确
// c = 1;          // 错误:虽然数值匹配,但类型不安全(除非开启隐式 any 或具体配置,最佳实践是使用枚举成员)

7. 数字枚举与字符串枚举的区别

下表总结了两种主要枚举类型的特性差异,以便在实际开发中根据需求选择。

特性 数字枚举 字符串枚举
自增行为 支持,默认从 0 开始递增 不支持,必须手动赋值
反向映射 支持(值 -> 键) 不支持
适用场景 状态码、标志位、内部逻辑 系统常量、API 接口参数、日志信息
可读性 较低(调试时看到的是数字) 较高(调试时看到的是有意义的字符串)

8. 计算与常量成员

虽然枚举通常使用简单的字面量,但也支持通过计算得出的值作为成员。

  1. 定义枚举成员时,使用表达式(如函数返回值或计算结果)。
  2. 注意:使用计算成员的枚举,后续未被初始化的成员不会自动获得自增值,必须手动赋值。
enum FileAccess {
  // 常量成员
  None,
  Read    = 1 << 1,
  Write   = 1 << 2,
  // 计算成员
  G = "123".length
}

// Read 的值是 2 (二进制 10)
console.log(FileAccess.Read); 

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文