Flow 枚举
Flow 枚举定义了一组固定的常量,这些常量创建它们自己的类型。
与 Flow 的其他功能不同,Flow 枚举在运行时作为值存在,并且也作为类型存在。
优势
枚举相对于现有模式提供了几个优势
- 减少重复:枚举声明提供了枚举的类型和值。
- 提高 Flow 性能:枚举保证具有良好的类型检查性能,不像联合类型,在某些情况下可能很昂贵。
- 启用新功能:枚举带有一个
cast
方法,它可以安全地将原始类型转换为枚举类型。 - 增强安全性:枚举定义它们自己的类型,该类型不会隐式强制转换为其他类型(例如,从
string
),并且需要在 switch 语句中进行穷举检查。这些属性可以帮助防止逻辑错误。
快速入门
定义枚举
一个名为 Status
的枚举,具有三个成员:Active
、Paused
和 Off
。
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;
阅读有关 枚举提供的其他方法的更多信息,包括 isValid
、members
和 getName
。
将枚举类型强制转换为其表示类型(必须显式执行)
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 枚举
枚举旨在涵盖许多用例并表现出某些优势。该设计做出了一系列权衡以实现这一点,在某些情况下,这些权衡可能不适合您。在这些情况下,您可以继续使用现有模式来满足您的用例。 阅读有关这些情况的更多信息.