TypeScript 枚举

注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。


在 TypeScript 中,枚举(enumeration)是一种数据类型,它允许你设置一组命名常量。

下面是一个枚举的简单示例。你可以阅读本教程的其余部分以了解更多信息。

示例

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

// Using the enum to set a direction
const currentDirection = Direction.Up;
console.log("Moving in direction:", currentDirection);

// Output: Moving in direction: UP

这里,Direction 是一个 enum,其可能值为 "UP""DOWN""LEFT""RIGHT",我们使用 Direction.Up 来设置移动方向。


声明一个枚举

要声明一个 enum,你需要使用 enum 关键字,后跟 enum 的名称。

enum enumName {
    
    // Set of named members
}

每个成员都可以是数值或字符串值,具体取决于你定义的 enum 的类型。


枚举的类型

枚举有两种类型。

  • 数字枚举
  • 字符串枚举

让我们来详细了解一下。


数字枚举

在数字枚举中,我们将相关的数字常量分组到一个名称下。

默认情况下,数字 enum 的第一个成员被赋值为 0,后续每个成员的值会递增一。

enum Level {
  Low,    // Automatically set to 0
  Medium, // Automatically set to 1
  High    // Automatically set to 2
}

console.log(Level.Low);
console.log(Level.Medium);
console.log(Level.High);

输出

0
1
2

在这里,我们定义了一个名为 Level 的数字 enum,它有三个成员:LowMediumHigh

成员
0
1
2

字符串枚举

字符串枚举允许你为 enum 成员分配字符串字面量,从而提供一种更有意义的方式来处理命名常量。

要定义一个字符串 enum,每个成员都必须用字符串值进行初始化。

enum Color {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE"
}

let favoriteColor: Color = Color.Green;
console.log("Favorite Color is:", favoriteColor); 

输出

Favorite Color is: GREEN

这里,Color 是一个 enum,它有助于管理一组与颜色名称相关的预定义字符串值。

请注意,我们使用 Color 作为数据类型来定义 favoriteColor 变量。

let favoriteColor: Color = Color.Green;

这意味着 favoriteColor 只能被赋值为 Color 枚举中定义的其中一个值。

注意:枚举确保变量只从预定义的集合中赋值。


访问枚举值

你可以通过两种方式访问枚举值:

1. 直接成员访问

2. 索引访问

请看下面的例子。

enum Day {
  Sunday,
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday
}

// Direct member access
console.log("First day of the week:", Day.Sunday);  

// Index access using a variable,
let dayIndex = Day.Monday;
console.log("Second day of the week:", Day[dayIndex]);  

输出

First day of the week: 0
Second day of the week: Monday

这里,

1. 直接成员访问

Day.Sunday 直接访问 enum 成员,由于它是第一个元素,它被自动赋值为数值 0

2. 索引访问

Day[dayIndex] 使用索引变量(dayIndex)来访问 enum。这里,dayIndex 被设置为 1,对应于 Monday,当使用时返回名称 "Monday"


为什么使用枚举?

枚举的使用原因有很多,以下列出其中一些。

1. 提高可读性

枚举通过为一组相关的值提供有意义的名称来提高可读性。例如,

使用枚举

enum Direction {
  North = 0,
  East = 1,
  South = 2,
  West = 3
}

function turn(direction: Direction) {
  console.log("Turning", Direction[direction]);
}

turn(Direction.North);

// Output: Turning North

这里,Direction.North 立即传达了方向是北。

不使用枚举

function turn(direction: number) {
  const directions = ["North", "East", "South", "West"];
  console.log("Turning", directions[direction]);
}

turn(0);

// Output: Turning North

除非你查看数组定义,否则数字 0 代表什么并不清楚。

2. 减少错误

枚举可防止分配可能导致运行时错误的无效值。例如,

假设你需要在应用程序中管理用户访问级别。

enum AccessLevel {
  Guest,
  User,
  Admin
}

function setAccessLevel(level: AccessLevel) {
  console.log("Your access level:", AccessLevel[level]);
}

setAccessLevel(AccessLevel.Admin);

setAccessLevel(AccessLevel.Super_Admin); // This would cause a compile-time error, as 'Super_Admin' is not a valid AccessLevel

当你尝试传递 Super_Admin(在 AccessLevel 枚举中未定义)时,会导致编译时错误。

3. 简化重构

更改枚举成员的值会更新代码库中的所有用法。

enum ServerStatus {
  Offline,
  Online,
  Maintenance
}

function logStatus(status: ServerStatus) {
  console.log("Server is currently", ServerStatus[status]);
}

logStatus(ServerStatus.Online);

输出

Server is currently Online

假设你需要向 ServerStaus 枚举添加一个新状态 Deprecated,你可以这样做。

enum ServerStatus {
  Offline,
  Online,
  Deprecated,  // Newly added
  Maintenance  // Index has shifted, but usage is correct.
}

添加 Deprecated 不会破坏现有代码,因为即使其他状态(如 Maintenance)的顺序发生变化,对它们的引用仍然是正确的。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战