跳至主要内容

Flow 枚举

Flow 枚举定义了一组固定的常量,这些常量创建它们自己的类型。

与 Flow 的其他功能不同,Flow 枚举在运行时作为值存在,并且也作为类型存在。

阅读如何在您的项目中启用 Flow 枚举.

优势

枚举相对于现有模式提供了几个优势

  • 减少重复:枚举声明提供了枚举的类型和值。
  • 提高 Flow 性能:枚举保证具有良好的类型检查性能,不像联合类型,在某些情况下可能很昂贵。
  • 启用新功能:枚举带有一个 cast 方法,它可以安全地将原始类型转换为枚举类型。
  • 增强安全性:枚举定义它们自己的类型,该类型不会隐式强制转换为其他类型(例如,从 string),并且需要在 switch 语句中进行穷举检查。这些属性可以帮助防止逻辑错误。

快速入门

定义枚举

一个名为 Status 的枚举,具有三个成员:ActivePausedOff

1enum Status {2  Active,3  Paused,4  Off,5}

默认情况下,枚举定义的成员具有与它们名称相同的字符串值。您也可以显式设置值

1enum Status {2  Active = 'active',3  Paused = 'paused',4  Off = 'off',5}

您也可以使用数字

1enum Status {2  Active = 1,3  Paused = 2,4  Off = 3,5}

值必须是唯一的、字面量,并且都是同一类型。查看 关于定义枚举的完整文档,以了解更多信息。

使用枚举

要访问枚举成员,请使用点访问

Status.Active

要将枚举类型用作注解,请使用枚举名称

const status: Status = Status.Active;

从表示类型(在本例中为 string)强制转换为枚举类型

const status: Status | void = Status.cast(someString);

您可以使用 ?? 运算符轻松提供默认值

const status: Status = Status.cast(someString) ?? Status.Off;

阅读有关 枚举提供的其他方法的更多信息,包括 isValidmembersgetName

将枚举类型强制转换为其表示类型(必须显式执行)

status as string

switch 语句中对枚举的检查是穷举的 - 我们确保您检查所有成员

1enum Status {2  Active,3  Paused,4  Off,5}6const status: Status = Status.Active;7
8// ERROR: Incomplete exhaustive check9switch (status) {
10 case Status.Active: break;11 case Status.Paused: break;12 // We forgot to add `case: Status.Off:` here, resulting in error above.13 // Using `default:` would also work to check all remaining members.14}
9:9-9:14: Incomplete exhaustive check: the member `Off` of enum `Status` [1] has not been considered in check of `status`. [invalid-exhaustive-check]

阅读有关 穷举检查枚举的更多信息。

查看 关于使用枚举的完整文档,以了解更多信息。

何时使用 Flow 枚举

如果您之前定义了字面量的联合类型,您可以使用枚举来定义该类型。而不是

1type Status =2  | 'Active'3  | 'Paused'4  | 'Off';5
6const x: Status = 'Active';

1const Status = Object.freeze({2  Active: 'Active',3  Paused: 'Paused',4  Off: 'Off',5});6type StatusType = $Keys<typeof Status>;7const x: StatusType = Status.Active;

您可以使用

1enum Status {2  Active,3  Paused,4  Off,5}6const x: Status = Status.Active;

查看 从旧模式迁移,以了解有关将旧的 JavaScript 枚举模式迁移到 Flow 枚举的更多信息。

何时不使用 Flow 枚举

枚举旨在涵盖许多用例并表现出某些优势。该设计做出了一系列权衡以实现这一点,在某些情况下,这些权衡可能不适合您。在这些情况下,您可以继续使用现有模式来满足您的用例。 阅读有关这些情况的更多信息.