5.1 クラスの宣言と使用
クラスの主な用途は、同じプロパティやメソッドを持ったオブジェクト(インスタンス)をいくつも作成することです。
5.1.1 クラス宣言と new 構文
Section titled “5.1.1 クラス宣言と new 構文”クラスを使用するには、まず class キーワードを用いてクラス宣言を行い、new 演算子を用いてインスタンスを作成します。
- 構文:
class クラス名 { ... } - インスタンス作成:
new クラス名() - 巻き上げの不在: 関数宣言とは異なり、クラスは宣言より前で使用しようとするとコンパイルエラーになります。
5.1.2 プロパティを宣言する
Section titled “5.1.2 プロパティを宣言する”クラス宣言の中ではプロパティを宣言し、初期値を設定することができます。
- 初期値:
name: string = "";のように指定します。初期値を省略する場合は、コンストラクタで確実に代入する必要があります。 - 修飾子: オブジェクト型と同様に、オプショナル(
?)や読み取り専用(readonly)を指定することも可能です。
5.1.3 メソッドを宣言する
Section titled “5.1.3 メソッドを宣言する”クラス内でメソッドを宣言すると、作成されたインスタンスは自動的にそのメソッドを持ちます。
- thisの利用: メソッド内では
thisキーワードを使って自分自身(そのインスタンス)のプロパティや他のメソッドを参照できます。
5.1.4 コンストラクタ
Section titled “5.1.4 コンストラクタ”constructor は、new によってインスタンスが作成される際に呼び出される特別な関数で、主にプロパティの初期化に使用されます。
- 引数:
new実行時に引数を渡し、それを使って内部のプロパティを初期化できます。 - 読み取り専用プロパティへの代入: コンストラクタ内に限り、
readonlyプロパティへの代入が許可されます。
5.1.5 静的プロパティ・静的メソッド
Section titled “5.1.5 静的プロパティ・静的メソッド”static キーワードを付けると、インスタンスではなくクラスそのものに属する静的プロパティや静的メソッドになります。
- アクセス: インスタンスからではなく、
User.adminNameのようにクラス名から直接アクセスします。
5.1.6 3種類のアクセシビリティ修飾子
Section titled “5.1.6 3種類のアクセシビリティ修飾子”プロパティやメソッドがどこからアクセス可能かを制御するために、3種類の修飾子が用意されています。
public: どこからでもアクセス可能(何も書かない場合のデフォルト)。private: クラスの定義内部からのみアクセス可能。外部のインターフェースと内部実装を分ける「カプセル化」に役立ちます。protected: そのクラス自身と、それを継承した子クラスからアクセス可能。
5.1.7 コンストラクタ引数でのプロパティ宣言
Section titled “5.1.7 コンストラクタ引数でのプロパティ宣言”コンストラクタの引数にアクセシビリティ修飾子(public や private など)を付けると、「プロパティの宣言」と「引数を使った初期化」を同時に行うことができ、コードを簡略化できます。
5.1.8 クラス式でクラスを作成する
Section titled “5.1.8 クラス式でクラスを作成する”関数式と同様に、class { ... } という構文(クラス式)を用いてクラスを作成し、変数に代入することができます。
5.1.9 もう1つのプライベートプロパティ
Section titled “5.1.9 もう1つのプライベートプロパティ”プロパティ名の先頭に # を付けることでも、プライベートプロパティを作ることができます。
private修飾子との違い:privateはTypeScriptのコンパイル時のチェックのみですが、#はJavaScriptの機能であり、実行時(ランタイム)にも外部からのアクセスを完全に防御します。
5.1.10 クラスの静的初期化ブロック
Section titled “5.1.10 クラスの静的初期化ブロック”クラス内に static { ... } というブロックを書くことで、クラスが評価される際に一度だけ実行される初期化処理を記述できます。このブロック内ではプライベートプロパティへのアクセスも許容されます。
5.1.11 型引数を持つクラス
Section titled “5.1.11 型引数を持つクラス”クラス名の後に <T> を付けることで、型引数を持つクラス(ジェネリクス)を宣言できます。
- 活用: インスタンスごとに異なる型(例:
User<string>やUser<number>)のデータを保持したい場合に適しています。 - 型推論:
new User(...)を呼び出す際、渡した引数から自動的に型引数が推論されるため、省略も可能です。