VVLL.net

Enums(枚举)

日期:2024-08-22 09:58:31

TypeScript 枚举(Enums)是一种用于定义一组命名常量的方式。枚举可以使代码更具可读性和可维护性,特别是在需要表示一组相关值的场景下。TypeScript 提供了数种方式来定义枚举,包括数字枚举、字符串枚举、异构枚举以及常量枚举。下面详细介绍 TypeScript 枚举的各种用法。

数字枚举

数字枚举是 TypeScript 中最常见的枚举类型。默认情况下,枚举成员的值从 0 开始递增。

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

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

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

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

字符串枚举

字符串枚举的每个成员必须用字符串字面量进行初始化。这种方式提供了更清晰的语义。

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

console.log(Direction.Up);    // 输出: "UP"
console.log(Direction.Down);  // 输出: "DOWN"
console.log(Direction.Left);  // 输出: "LEFT"
console.log(Direction.Right); // 输出: "RIGHT"

异构枚举

异构枚举允许混合使用字符串和数字成员。这种用法较少见,但在某些特定场景下可能会有用。

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

console.log(BooleanLikeHeterogeneousEnum.No);  // 输出: 0
console.log(BooleanLikeHeterogeneousEnum.Yes); // 输出: "YES"

计算和常量成员

枚举成员可以是常量或计算值。常量成员是在编译时计算出的值,而计算成员则是在运行时计算的。

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.Write);     // 输出: 4
console.log(FileAccess.ReadWrite); // 输出: 6
console.log(FileAccess.G);         // 输出: 3

常量枚举

常量枚举使用 const 关键字定义,编译时会被完全移除。常量枚举只在性能优化上有用,特别是在频繁使用的情况下。

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

let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

编译后的代码将不包含枚举定义,而是直接使用其值:

// 编译后的代码
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

反向映射

数字枚举成员不仅创建从名字到值的映射,还创建从值到名字的反向映射。

enum Enum {
  A
}

console.log(Enum.A);    // 输出: 0
console.log(Enum[0]);   // 输出: "A"

反向映射仅适用于数字枚举成员,字符串枚举成员不提供这种特性。

枚举成员类型

枚举成员类型可以作为单独的类型使用,尤其在需要特定值的场景下。

enum ShapeKind {
  Circle,
  Square
}

interface Circle {
  kind: ShapeKind.Circle;
  radius: number;
}

interface Square {
  kind: ShapeKind.Square;
  sideLength: number;
}

let c: Circle = {
  kind: ShapeKind.Circle,
  radius: 100
};

总结

TypeScript 枚举提供了一种灵活和强大的方式来定义一组命名常量,使代码更加可读和易于维护。以下是总结的几点:

  • 数字枚举:默认从 0 开始递增,可以手动指定值。
  • 字符串枚举:每个成员用字符串字面量初始化,提供清晰的语义。
  • 异构枚举:允许混合字符串和数字成员。
  • 计算和常量成员:支持在编译时和运行时计算的成员。
  • 常量枚举:使用 const 关键字定义,编译时移除以优化性能。
  • 反向映射:数字枚举成员支持从名字到值和从值到名字的反向映射。
  • 枚举成员类型:可以作为单独的类型使用。

通过掌握这些特性,你可以更有效地使用 TypeScript 枚举来构建强类型的应用程序。

参考

标签