static readonly プロパティを定義する
TypeScript 2.0 以降では、クラス内の static
プロパティに readonly
キーワードを付けて読み取り専用であることを示すことができます。
クラス定数を別ファイルから参照する
このようなクラスをモジュールとして公開 (export
) すれば、アプリ全体でそのクラス定数を共有できます。
配列をクラス定数にする (ReadonlyArray)
readonly
キーワードは、その変数への代入を禁止するだけなので、オブジェクト自体のセット系メソッドは呼び出せてしまいます。
配列に関しても各要素の値が変更できてしまうのは同様ですが、TypeScript にはそれを禁止するための ReadonlyArray<T>
というジェネリッククラスが用意されています。
get アクセサを定義する方法
ECMAScript5 で導入された get
アクセサを使う方法でも、クラス定数のような表現が可能です。
ただし、get
アクセサは関数定義になるので、若干記述が冗長になってしまうのと、呼び出しごとに処理が走るという違いがあります。
(コラム)const キーワードは使えない
TypeScript や、そのベースになっている JavaScript では、次のようにクラス内の static
プロパティに const
を付けようとするとエラーになります。
なので、const
の代わりに、TypeScript 2.0 で導入された readonly
キーワードを使用しましょう。
TypeScript 2.0 より前のバージョンしか使えない場合は、次のように namespace
を使えば、一応クラス定数っぽいものを定義することができます。
(コラム)namespace を使ったクラス定数もどき
名前空間 (namespace
) 内で定数を定義すると、あたかもクラス定数のように使用することができます。
この namespace
を使った定義方法であれば、TypeScript 2.0 より前のバージョンでも使用できます。
export
は名前空間と定数の両方に付けなければいけないことに注意してください。
最初の export
は、このモジュール(ファイル)が SiteInfo
名前空間を公開することを示し、2 つ目の export
は、SiteInfo
名前空間が FAQ_URL
を公開することを示しています。
上記のように定義した定数は、次のように import
して参照することができます。
参照方法は、クラス定数 (static readonly
) を扱う場合と同様です。
ただし、このように定義した SiteInfo
はクラスではなく名前空間なので、そこにインスタンスメソッドを追加するといったことはできません。
名前空間は、あくまで定数を階層化して管理したい場合のみに使用できます。