ts枚举

2024-07-11 12:26:10 456
枚举(Enum)是 TypeScript 提供的一种数据类型,用于定义一组有名字的常量。枚举使得代码更加可读和可维护。下面是对枚举的详细介绍,包括用法和示例。

枚举类型

数字枚举

数字枚举是最常见的枚举类型,默认情况下,第一个枚举成员的值为 0,后续成员的值递增。

enum Direction {
  Up,
  Down,
  Left,
  Right
}

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

你也可以手动设置枚举成员的值,后续成员的值会从指定的值开始递增。

enum Direction {
  Up = 1,
  Down,
  Left,
  Right
}

let dir: Direction = Direction.Up;
console.log(dir); // 输出:1

你还可以为每个成员指定不同的值。

enum Direction {
  Up = 1,
  Down = 3,
  Left = 5,
  Right = 7
}

let dir: Direction = Direction.Left;
console.log(dir); // 输出:5

字符串枚举

字符串枚举的每个成员都必须用字符串字面量初始化。字符串枚举的优点是更易于调试和阅读。

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}

let dir: Direction = Direction.Up;
console.log(dir); // 输出:"UP"

异构枚举

异构枚举是指同时包含数字和字符串成员的枚举。虽然可以定义异构枚举,但在大多数情况下,不建议这样做,因为它可能会导致代码的可读性和可维护性下降。

enum BooleanLikeHeterogeneousEnum {
  No = 0,
  Yes = "YES"
}

let boolEnum: BooleanLikeHeterogeneousEnum = BooleanLikeHeterogeneousEnum.Yes;
console.log(boolEnum); // 输出:"YES"

反向映射

对于数字枚举,TypeScript 会生成反向映射。这意味着你可以通过枚举的值来获取对应的名称。

enum Direction {
  Up,
  Down,
  Left,
  Right
}

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

字符串枚举不会生成反向映射。

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}

// 这行代码会报错,因为字符串枚举没有反向映射
// console.log(Direction["UP"]); 

常量枚举

常量枚举使用 const enum 声明,编译时会被内联,从而减少额外的代码开销。

const enum Direction {
  Up,
  Down,
  Left,
  Right
}

let directions = [Direction.Up, Direction.Down, Direction.Left, Direction.Right];
console.log(directions); // 输出:[0, 1, 2, 3]

枚举成员类型

枚举成员可以是常量成员或计算成员。常量成员在编译时确定,计算成员在运行时计算。

enum FileAccess {
  // 常量成员
  None,
  Read = 1 << 1,
  Write = 1 << 2,
  ReadWrite = Read | Write,
  // 计算成员
  G = "123".length
}

console.log(FileAccess.None); // 输出:0
console.log(FileAccess.Read); // 输出:2
console.log(FileAccess.ReadWrite); // 输出:6
console.log(FileAccess.G); // 输出:3

枚举的使用案例

枚举在很多场景中都很有用,例如状态管理、方向指示、事件类型等。

状态管理

enum Status {
  Idle,
  Loading,
  Success,
  Error
}

function handleStatus(status: Status) {
  switch (status) {
    case Status.Idle:
      console.log("Idle");
      break;
    case Status.Loading:
      console.log("Loading");
      break;
    case Status.Success:
      console.log("Success");
      break;
    case Status.Error:
      console.log("Error");
      break;
  }
}

handleStatus(Status.Loading); // 输出:"Loading"

方向指示

enum Direction {
  Up,
  Down,
  Left,
  Right
}

function move(direction: Direction) {
  switch (direction) {
    case Direction.Up:
      console.log("Moving up");
      break;
    case Direction.Down:
      console.log("Moving down");
      break;
    case Direction.Left:
      console.log("Moving left");
      break;
    case Direction.Right:
      console.log("Moving right");
      break;
  }
}

move(Direction.Left); // 输出:"Moving left"

枚举是 TypeScript 中非常有用的特性,提供了一种便捷的方式来定义和使用一组相关的常量。无论是数字枚举、字符串枚举还是异构枚举,都可以提高代码的可读性和可维护性。通过合理地使用枚举,可以使代码更加清晰、易于理解和调试。