TypeScript のクラスは、Java や Kotlin に似た文法で定義します。 インタフェースの定義に似ていますが、コンストラクタやメソッドを持つことができるという大きな違いがあります。
簡単なクラス
次の Greeter
クラスは、1 つのプロパティ、1 つのコンストラクタ、1 つのメソッドを持っています。
コンストラクタやメソッドの前に function
というキーワードは必要ないことに注意してください。
プロパティやメソッドの可視性は デフォルトで public
になるため、外部からアクセスできないようにするには、明示的に private
と指定する必要があります。
クラスのインスタンスを生成するには、次のように new
キーワードを使用します。
プロパティ定義の省略
コンストラクタ (constructor()
) のパラメータ名の前に、private
や public
といった可視性を指定すると、プロパティ定義とその値を設定するコードを省略することができます。
次のようなコードは、
次のように省略して記述することができます。
public
でリードオンリーなプロパティとして定義する場合は、こんな感じ。
コンストラクタのデフォルト引数
関数のパラメータと同様に、コンストラクタのパラメータでもデフォルト引数の仕組みを使用できます。
プロパティの setter/getter を定義する
メソッド名の前に set
キーワード、 get
キーワードを付けて定義することで、プロパティの setter/getter を定義することができます。
setter はプロパティへの代入時 (obj.prop = value
) に呼び出され、getter はプロパティの参照時 (value = obj.prop
) に呼び出されます。
setter/getter には可視性を指定することはできず、必ず public
として扱われます。
次の例では、title
という名前の setter/getter を定義しています。
実際の値は、_title
というプライベートプロパティに保存しています。
次のように getter だけを定義しておけば、外からは値を変更できないリードオンリーなプロパティを定義することができます。
下記の Counter
クラスの count
プロパティは参照専用で、外から値を代入できないようになっています。
上記のように getter のみを提供することは、プロパティ自体に readonly
キーワードを付けるのとは異なることに注意してください。
プロパティに readonly
を付けると、クラスの中からもその値を変更できなくなります。
次のようにクラス定数を定義するときに使えます。
(応用)プライベートコンストラクタ
コンストラクタ (constructor
) を private
定義することで、外部からの new
呼び出しを禁止することができます。
代わりに、static
なファクトリメソッドを用意してインスタンス生成できるようにします。
static
メソッドから、this()
でコンストラクタを呼び出せるところがポイントです。
関連記事
- TypeScript のコーディング規約(ルール/ガイドライン)
- TypeScriptの型: 既存の JavaScript ライブラリに型情報を追加する(.d.ts ファイル)
- TypeScriptサンプル: ジェネリッククラスの定義例(MyStackクラス)
- TypeScriptサンプル: 文字列内のひらがなとカタカナを変換する (hiraToKana, kanaToHira)
- TypeScriptの型: クラス定数を定義する (static readonly)
- TypeScriptのモジュールのインポートには import を使う
- TypeScriptの型: インタフェースを結合する (交差型: Intersection types)