Programmingフルスタック開発者

TypeScriptにおけるenumの型付けはどのように機能し、enumの種類にはどのようなものがあり、定数値と計算値の違いは何ですか?enumを使用する際に発生する可能性のある落とし穴は何ですか?

Hintsage AIアシスタントで面接を突破

答え

TypeScriptでは、2種類のenumがサポートされています:

  • 数値型(numeric) — デフォルトの値は0から始まり、順に割り当てられます。
  • 文字列型(string) — 各値は明示的に設定する必要があり、文字列となります。

また、混合型の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は直接的な(名前 → 値)マッピングのみを行います。
  • 同じenum内で型の混合を行うとコンパイルエラーが発生します。

トリックの質問

新しい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でのみ再現されました。