as constの役割がいまいち理解できてなかったので、見返す用にまとめます。
自分の理解用に抽象化しているので詳細はサバイバルTypeScriptなどをご参照ください。
概要
as constを使うとTypeScriptでリテラル型の定数を定義できる。オブジェクトや配列を変更不可能(読み取り専用)にし、それらのプロパティの型をリテラル型とする。
具体例
const CounterActions = {
DECREMENT: 'DECREMENT',
INCREMENT: 'INCREMENT',
ADD: 'ADD',
} as const;
この場合、CounterActionsオブジェクトの各プロパティは'DECREMENT' | 'INCREMENT' | 'ADD'という文字列リテラル型として推論され、変更不可能になる。
as constの役割の要点
1 変更不可能にする
- オブジェクトや配列のプロパティを読み取り専用にする。
- readonly修飾子が自動的に追加される。
2 リテラル型として推論させる
- 各プロパティの型をその具体的な値(リテラル型)として推論する。
- 'DECREMENT'はstringではなく、文字列リテラル型'DECREMENT'として推論される。
- as constをしない場合は型推論でstring型と判断されてしまう。
使用場面と注意点
使用場面
-
変更不可の定数オブジェクトや配列を定義したいとき。状態管理のためのアクションタイプや設定値など。
-
特定のリテラル型として値を扱いたいとき。'DECREMENT'や42など特定の値のみを許容するユニオン型を作成する場合。
使用例
const directions = ['North', 'South', 'East', 'West'] as const;
type Direction = typeof directions[number];
// Direction は 'North' | 'South' | 'East' | 'West' というユニオン型
注意点
-
可読性
as constを使うと、コードの意図が明確になり、可読性が向上しますが、過度に使用するとかえって混乱することがあります。適切なコメントやドキュメントを追加すると良いでしょう。 -
変更不可の性質
as constを使用すると、オブジェクトや配列のプロパティが読み取り専用になります。これを意図しない場合は注意が必要です。
関連
-
readonly修飾子:
プロパティを変更不可にするために使用される修飾子。as constはこれを自動的に適用する。 -
ユーティリティ型:
TypeScriptには多くのユーティリティ型(型を操作するためのツール)がある。as constと組み合わせて使うことが多い。
Partial<T>,プロパティをオプショナルにする
Required<T>,プロパティを必須にする
Readonly<T>,プロパティを読み取り専用にする
Pick<T>,指定したプロパティのみを抽出
Record<K, T>: キーの型Kと値の型Tを持つオブジェクト型を生成
Pick<T, K>: 型Tから指定されたプロパティKだけを抽出
Omit<T, K>: 型Tから指定されたプロパティKを除外
ValueOf<T>,ビルトインのユーティリティ型ではないので
あらかじめ「type ValueOf<T> = T[keyof T];」のように定義が必要。
T型のキーを抽出し、抽出したキーに対応するvalue(値)を取得する。