TypeScript 枚举:enum 类型的定义与使用
枚举是 TypeScript 中一种特有的数据结构,它允许开发者定义一组具名的常量。使用枚举可以显著提高代码的可读性,避免使用“魔术数字”或难以记忆的字符串,让代码逻辑更加清晰。
1. 定义数字枚举
数字枚举是 TypeScript 中默认的枚举类型。如果不指定初始值,枚举成员的值会从 0 开始自动递增。
- 使用
enum关键字定义一个名为Direction的枚举。 - 列出枚举成员,如
Up、Down、Left、Right。 - 访问枚举成员,通过点号语法获取其对应的数值。
enum Direction {
Up, // 默认值为 0
Down, // 默认值为 1
Left, // 默认值为 2
Right // 默认值为 3
}
// 输出: 0
console.log(Direction.Up);
2. 设置数字枚举的初始值
开发者可以手动指定枚举成员的数值,未被指定的成员会根据前一个值自动递增。
- 定义枚举时,在第一个成员后使用等号 赋值。
- 观察后续成员的数值变化,它们将基于初始值自动递增。
enum Status {
Success = 200,
NotFound = 404,
ServerError // 自动递增为 405
}
// 输出: 405
console.log(Status.ServerError);
3. 理解数字枚举的反向映射
数字枚举的一个强大特性是支持反向映射:即可以通过值获取到键名。
- 定义一个数字枚举
EnumRole。 - 使用枚举名作为对象,传入数值作为键。
- 获取对应的成员名称。
enum EnumRole {
Admin = 1,
User = 2
}
// 正向映射:值
console.log(EnumRole.Admin); // 输出: 1
// 反向映射:键名
console.log(EnumRole[1]); // 输出: "Admin"
4. 定义字符串枚举
字符串枚举要求每个成员都必须用字符串字面量进行初始化,不支持自增,也不支持反向映射。这种类型常用于需要明确语义的场景(如 API 请求参数)。
- 声明枚举成员,并赋予其字符串字面量。
- 确保所有成员都有明确的字符串值。
enum MediaType {
JSON = "application/json",
XML = "application/xml",
FORM = "multipart/form-data"
}
// 输出: "application/json"
console.log(MediaType.JSON);
5. 使用常量枚举
为了优化性能,减少编译后的代码量,可以使用 const 关键字定义常量枚举。常量枚举在编译阶段会被完全删除,使用处会被内联替换为常量值。
- 在
enum关键字前添加const修饰符。 - 编写枚举定义。
- 注意:常量枚举不能包含计算成员。
const enum Align {
Left,
Right,
Center
}
// 编译后的代码类似: let align = 0; (Align.Left 被替换)
let align = Align.Left;
6. 枚举作为类型使用
枚举不仅仅可以存储值,还可以直接作为类型注解使用,从而限制变量的取值范围。
- 定义一个枚举
Color。 - 声明变量时,使用
Color作为类型。 - 赋值时,变量只能是
Color中的成员之一,否则 TypeScript 会报错。
enum Color {
Red,
Green,
Blue
}
let c: Color;
c = Color.Red; // 正确
c = Color.Green; // 正确
// c = 1; // 错误:虽然数值匹配,但类型不安全(除非开启隐式 any 或具体配置,最佳实践是使用枚举成员)
7. 数字枚举与字符串枚举的区别
下表总结了两种主要枚举类型的特性差异,以便在实际开发中根据需求选择。
| 特性 | 数字枚举 | 字符串枚举 |
|---|---|---|
| 自增行为 | 支持,默认从 0 开始递增 | 不支持,必须手动赋值 |
| 反向映射 | 支持(值 -> 键) | 不支持 |
| 适用场景 | 状态码、标志位、内部逻辑 | 系统常量、API 接口参数、日志信息 |
| 可读性 | 较低(调试时看到的是数字) | 较高(调试时看到的是有意义的字符串) |
8. 计算与常量成员
虽然枚举通常使用简单的字面量,但也支持通过计算得出的值作为成员。
- 定义枚举成员时,使用表达式(如函数返回值或计算结果)。
- 注意:使用计算成员的枚举,后续未被初始化的成员不会自动获得自增值,必须手动赋值。
enum FileAccess {
// 常量成员
None,
Read = 1 << 1,
Write = 1 << 2,
// 计算成员
G = "123".length
}
// Read 的值是 2 (二进制 10)
console.log(FileAccess.Read); 
暂无评论,快来抢沙发吧!