TypeScriptでは、2種類のenumがサポートされています:
また、混合型のenum(ヘテロジェニックenum)もありますが、その使用は強く推奨されていません。
例:
enum Status { Init, Loading, Ready = 5, Error } // Status.Error === 6 enum HttpCode { Ok = 200, NotFound = 404, Internal = 'INTERNAL_ERROR' // エラー!文字列または数値のいずれかのみ } enum Direction { Up = 'UP', Down = 'DOWN', }
定数値はコンパイル時に計算されます。ENUMの値が他の計算や式(例えば、関数)に依存している場合、それは計算値(computed member)になります。現在のメンバーのデフォルト値として、前のメンバーのみを使用することができます。
重要な特徴:
新しいenumメンバーを宣言する際に、別のenumの値を使用することができますか?
答え: はい、ただしその値が定数または以前に宣言されたメンバーである場合のみです。
例:
enum A { X = 1 } enum B { Y = A.X } // OK
しかし、関数に基づく計算や他の場所からのデータ(例えば、関数呼び出し)は使用できません。
物語
外部APIへのデータシリアル化のためのプロジェクトで、数値型enumが使用されました。enumのメンバーの順序を変更すると、値が「ずれて」、外部システムが異なる数字を受け取るようになりました。これにより、外部クライアントで追跡不能な不正な状態が引き起こされました。
物語
あるReactプロジェクトでは、string型とnumeric型のenumがswitch-caseで誤って使用され、値が文字列に変換されることを期待していました。不一致によりswitchが正しく機能せず、コンポーネントが無効なUIを返していました。
物語
計算値の一部が関数によって計算されるenumを作ろうとした際、TypeScriptはエラーを出しませんでしたが、特定のビルドで値がundefinedになることがありました。これにより、enumがパスの識別子として使用される際にルーティングの問題が発生しました。クリティカルなエラーはproduction bundleでのみ再現されました。