跳至主要內容

Flow 枚舉

Flow 枚舉定義一組固定的常數,並建立其自己的類型。

與 Flow 的其他功能不同,Flow 枚舉在執行階段以值的形式存在,同時也以類型的形式存在。

閱讀如何在專案中啟用 Flow 枚舉.

優點

枚舉提供多種優點,優於現有的模式

  • 減少重複:枚舉宣告提供枚舉的類型和值。
  • 改善 Flow 效能:枚舉保證具有良好的類型檢查效能,與在某些情況下類型檢查可能很昂貴的聯集不同。
  • 啟用新功能:枚舉附帶一個 cast 方法,可安全地將基本類型轉換為枚舉類型。
  • 增強安全性:列舉定義自己的類型,此類型不會隱式轉換為其他類型(例如從 字串)或從其他類型轉換而來,並且必須 在 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;

從表示類型(在本例中為 字串)轉換為列舉類型

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 列舉

列舉設計用於涵蓋許多使用案例,並展現某些優點。此設計進行了各種權衡以實現此目的,在某些情況下,這些權衡可能不適合您。在這些情況下,您可以繼續使用現有模式來滿足您的使用案例。 進一步了解這些情況