問題の歴史:
Enum は、C/C++ などの言語から来た、名前付き定数の有限セットを記述するための型です。JavaScript にはありませんでしたが、TypeScript ではサポートが実装されています。パフォーマンスを向上させるために考案されたのが const enum で、値がコンパイル段階で直接挿入される拡張機能です。
問題:
通常の enum は JS で多くの補助コード(名前<->値の双方向の関係を保証するオブジェクト)を生成します。これは必ずしも必要ではなく、特に最大限のパフォーマンスと最小のバンドルサイズが重要な場合には問題です。
解決策:
値をコンパイル時にインラインで挿入し、余分なコードを回避するために const enum を使用します。ただし、const enum には制限があります。TypeScript プロジェクト内でのみ動作し、異なるモジュールにトランスパイルする際に使用が難しく、tree shaking や import/export に問題が生じる可能性があります。
コード例:
const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // JS では単に 2 になります
主な特徴:
d.ts ファイルや公共ライブラリで const enum を使用できますか?
いいえ。再コンパイルや型の記述時にエラーを引き起こすことが多いため、ライブラリでは const enum を避けることをお勧めします。
isolatedModules パラメータや babel でコンパイル時に const enum を使用するとどうなりますか?
エラーが発生します。babel と isolatedModules は、安全に値をコンパイル時に挿入できることを保証できないため、const enum のインライン処理をサポートしていません。
const enum で計算された値や文字列値を使用できますか?
複雑な計算(例えば、関数や変数を通じた式)は禁止されています。単純な数値と文字列のみが許可されています。
ライブラリに const enum を公開し、.d.ts で定義した際、消費者が最終バンドルにインポート文字列がないためにエラーを受け取る。
利点:
欠点:
プロジェクトのプライベート部分だけで const enum を使用し、外部にエクスポートしなかった:
const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];
利点:
欠点: