文章目录

TypeScript 枚举:数字枚举与字符串枚举

发布于 2026-04-01 22:46:07 · 浏览 9 次 · 评论 0 条

TypeScript 枚举:数字枚举与字符串枚举


TypeScript 枚举(Enums)是 TypeScript 提供的一种类型安全的枚举类型,用于定义一组命名的常量。枚举在实际开发中非常有用,可以提升代码的可读性和可维护性。本文将详细介绍 TypeScript 中的两种枚举类型:数字枚举和字符串枚举,并通过示例说明它们的使用方法和注意事项。


一、数字枚举

1.1 基本定义

数字枚举是 TypeScript 中最常见的一种枚举类型。它默认从 0 开始,依次递增。你可以通过显式指定枚举成员的值来覆盖默认行为。

enum Color {
  Red = 1,
  Green = 2,
  Blue = 3
}

在上面的例子中,Color.Red 的值为 1,Color.Green 的值为 2,Color.Blue 的值为 3。

1.2 使用枚举

你可以通过枚举名和成员名来访问枚举值:

console.log(Color.Red); // 输出: 1
console.log(Color.Green); // 输出: 2
console.log(Color.Blue); // 输出: 3

你也可以通过枚举值来获取枚举成员名:

console.log(Color[1]); // 输出: "Red"
console.log(Color[2]); // 输出: "Green"
console.log(Color[3]); // 输出: "Blue"

1.3 枚举的反向映射

TypeScript 会自动为枚举成员创建一个反向映射,即从枚举值到枚举成员名的映射。这在处理枚举值时非常有用。

enum Direction {
  Up = 1,
  Down = 2,
  Left = 3,
  Right = 4
}

function getDirectionName(direction: number): string {
  return Direction[direction];
}

console.log(getDirectionName(1)); // 输出: "Up"
console.log(getDirectionName(2)); // 输出: "Down"
console.log(getDirectionName(3)); // 输出: "Left"
console.log(getDirectionName(4)); // 输出: "Right"

1.4 枚举的计算值

枚举成员的值可以是任意表达式,而不仅仅是数字。例如:

enum Status {
  Active = "active",
  Inactive = "inactive",
  Pending = "pending"
}

console.log(Status.Active); // 输出: "active"
console.log(Status.Inactive); // 输出: "inactive"
console.log(Status.Pending); // 输出: "pending"

1.5 枚举的计算值与数字枚举的混合使用

你可以在枚举中混合使用数字和计算值:

enum LogLevel {
  Debug = 1,
  Info = 2,
  Warning = 3,
  Error = 4
}

enum Status {
  Active = LogLevel.Error + 1,
  Inactive = LogLevel.Warning + 1
}

console.log(Status.Active); // 输出: 5
console.log(Status.Inactive); // 输出: 4

二、字符串枚举

2.1 基本定义

字符串枚举与数字枚举类似,但它的成员值是字符串类型。字符串枚举的默认值是空字符串 "",并且不能重复。

enum Direction {
  Up = "up",
  Down = "down",
  Left = "left",
  Right = "right"
}

在上面的例子中,Direction.Up 的值为 "up"Direction.Down 的值为 "down"Direction.Left 的值为 "left"Direction.Right 的值为 "right"

2.2 使用枚举

你可以通过枚举名和成员名来访问枚举值:

console.log(Direction.Up); // 输出: "up"
console.log(Direction.Down); // 输出: "down"
console.log(Direction.Left); // 输出: "left"
console.log(Direction.Right); // 输出: "right"

你也可以通过枚举值来获取枚举成员名:

console.log(Direction["up"]); // 输出: "Up"
console.log(Direction["down"]); // 输出: "Down"
console.log(Direction["left"]); // 输出: "Left"
console.log(Direction["right"]); // 输出: "Right"

2.3 枚举的反向映射

字符串枚举同样会自动创建反向映射,即从枚举值到枚举成员名的映射。

enum Direction {
  Up = "up",
  Down = "down",
  Left = "left",
  Right = "right"
}

function getDirectionName(direction: string): string {
  return Direction[direction];
}

console.log(getDirectionName("up")); // 输出: "Up"
console.log(getDirectionName("down")); // 输出: "Down"
console.log(getDirectionName("left")); // 输出: "Left"
console.log(getDirectionName("right")); // 输出: "Right"

2.4 枚举的计算值

字符串枚举的成员值可以是任意表达式,而不仅仅是字符串。例如:

enum Status {
  Active = "active",
  Inactive = "inactive",
  Pending = "pending"
}

console.log(Status.Active); // 输出: "active"
console.log(Status.Inactive); // 输出: "inactive"
console.log(Status.Pending); // 输出: "pending"

2.5 枚举的计算值与字符串枚举的混合使用

你可以在枚举中混合使用字符串和计算值:

enum LogLevel {
  Debug = "debug",
  Info = "info",
  Warning = "warning",
  Error = "error"
}

enum Status {
  Active = LogLevel.Debug + "Active",
  Inactive = LogLevel.Warning + "Inactive"
}

console.log(Status.Active); // 输出: "debugActive"
console.log(Status.Inactive); // 输出: "warningInactive"

三、枚举的高级用法

3.1 枚举的联合类型

你可以将枚举类型与其他类型进行联合,以扩展枚举的使用范围。

enum Direction {
  Up = "up",
  Down = "down",
  Left = "left",
  Right = "right"
}

type Position = Direction | "center";

function move(direction: Position): void {
  if (direction === "center") {
    console.log("Move to center");
  } else {
    console.log(`Move ${direction}`);
  }
}

move(Direction.Up); // 输出: Move up
move(Direction.Down); // 输出: Move down
move(Direction.Left); // 输出: Move left
move(Direction.Right); // 输出: Move right
move("center"); // 输出: Move to center
```

### 3.2 枚举的索引签名

你可以为枚举添加索引签名,以支持动态访问枚举成员。

```typescript
enum Direction {
  Up = "up",
  Down = "down",
  Left = "left",
  Right = "right"
}

type DirectionMap = {
  [key: string]: Direction;
};

const directionMap: DirectionMap = {
  up: Direction.Up,
  down: Direction.Down,
  left: Direction.Left,
  right: Direction.Right
};

function getDirection(direction: string): Direction {
  return directionMap[direction];
}

console.log(getDirection("up")); // 输出: "up"
console.log(getDirection("down")); // 输出: "down"
console.log(getDirection("left")); // 输出: "left"
console.log(getDirection("right")); // 输出: "right"
```

### 3.3 枚举的常量成员

你可以将枚举成员标记为常量,以确保其值在编译时就被确定下来。

```typescript
enum Direction {
  Up = "up",
  Down = "down",
  Left = "left",
  Right = "right"
}

const direction = Direction.Up;

function move(direction: typeof direction): void {
  console.log(`Move ${direction}`);
}

move(direction); // 输出: Move up

四、枚举的注意事项

4.1 枚举的默认值

数字枚举的默认值是 0,字符串枚举的默认值是空字符串 ""。如果你不显式指定枚举成员的值,TypeScript 会自动使用默认值。

enum Direction {
  Up,
  Down,
  Left,
  Right
}

console.log(Direction.Up); // 输出: 0
console.log(Direction.Down); // 输出: 1
console.log(Direction.Left); // 输出: 2
console.log(Direction.Right); // 输出: 3

4.2 枚举的重复值

在数字枚举中,重复的值会导致编译错误。在字符串枚举中,重复的值会导致运行时错误。

enum Direction {
  Up = "up",
  Down = "down",
  Left = "left",
  Right = "right"
}

// 以下代码会导致编译错误
// enum Direction {
//   Up = "up",
//   Down = "up", // 重复的值
//   Left = "left",
//   Right = "right"
// }

4.3 枚举的计算值

枚举成员的值可以是任意表达式,而不仅仅是数字或字符串。例如:

enum Status {
  Active = "active",
  Inactive = "inactive",
  Pending = "pending"
}

enum LogLevel {
  Debug = Status.Active + "Debug",
  Info = Status.Inactive + "Info",
  Warning = Status.Pending + "Warning"
}

console.log(LogLevel.Debug); // 输出: "activeDebug"
console.log(LogLevel.Info); // 输出: "inactiveInfo"
console.log(LogLevel.Warning); // 输出: "pendingWarning"

五、总结

TypeScript 枚举是一种非常实用的类型安全工具,可以帮助你定义一组命名的常量。数字枚举和字符串枚举各有其适用场景,你可以根据实际需求选择合适的枚举类型。通过合理使用枚举,你可以提升代码的可读性和可维护性,减少错误的发生。

评论 (0)

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

扫一扫,手机查看

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