Flow 枚舉
Flow 枚舉定義一組固定的常數,並建立其自己的類型。
與 Flow 的其他功能不同,Flow 枚舉在執行階段以值的形式存在,同時也以類型的形式存在。
優點
枚舉提供多種優點,優於現有的模式
- 減少重複:枚舉宣告提供枚舉的類型和值。
- 改善 Flow 效能:枚舉保證具有良好的類型檢查效能,與在某些情況下類型檢查可能很昂貴的聯集不同。
- 啟用新功能:枚舉附帶一個
cast
方法,可安全地將基本類型轉換為枚舉類型。 - 增強安全性:列舉定義自己的類型,此類型不會隱式轉換為其他類型(例如從
字串
)或從其他類型轉換而來,並且必須 在 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;
從表示類型(在本例中為 字串
)轉換為列舉類型
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 列舉
列舉設計用於涵蓋許多使用案例,並展現某些優點。此設計進行了各種權衡以實現此目的,在某些情況下,這些權衡可能不適合您。在這些情況下,您可以繼續使用現有模式來滿足您的使用案例。 進一步了解這些情況。