5.2 クラスの型
クラスの基本的な使い方を踏まえ、次はTypeScriptの「型システム」の側面からクラスがどのように振る舞うかを学習します。
5.2.1 クラス宣言はインスタンスの型を作る
Section titled “5.2.1 クラス宣言はインスタンスの型を作る”クラス宣言(例:class User)の重要な特徴は、クラスオブジェクトという「値」を作ると同時に、インスタンスの型(User 型)も同時に作成することです。
- 構造的部分型: 作成される型は、そのクラスが持つプロパティやメソッドの「構造」を表します。そのため、
new User()で作られていないオブジェクトであっても、構造さえ一致していればUser型として扱うことができます。 - クラス式との違い: クラス宣言特有の挙動であり、クラス式(
const User = class {})では型は作成されません。 - 型引数の反映: 型引数を持つクラス(例:
class User<T>)を宣言した場合、作られる型も型引数を持つ型になります。
コラム22 変数名の名前空間と型名の名前空間
Section titled “コラム22 変数名の名前空間と型名の名前空間”TypeScriptのプログラム内の名前(識別子)は、「変数名の名前空間」 と 「型名の名前空間」 の2種類に分けて管理されています。
- 独立した空間: この2つの名前空間は独立しているため、まったく同じ名前(例:
Item)を変数と型の両方で同時に定義しても、文脈によって判断されるため衝突しません。 - クラス宣言の正体: クラス宣言とは、この「変数名の名前空間」と「型名の名前空間」の両方に、同時に同じ名前を作成する特別な構文なのです。
5.2.2 newシグネチャによるインスタンス化可能性の表現
Section titled “5.2.2 newシグネチャによるインスタンス化可能性の表現”クラスオブジェクトそのもの(変数に入っているコンストラクタ)の型を表現するための記法も存在します。
- 基本構文:
new (引数リスト) => インスタンスの型と記述します(関数型の記法の先頭にnewがついた形です)。 - newシグネチャ: オブジェクト型の中で
new (引数リスト): インスタンスの型と記述するコールシグネチャの亜種もあります。静的プロパティなどを持つクラスオブジェクトを表現する際はこちらが適しています。
5.2.3 instanceof演算子と型の絞り込み
Section titled “5.2.3 instanceof演算子と型の絞り込み”instanceof 演算子は、与えられた値が特定のクラスのインスタンス(new で作られたオブジェクト)であるかを真偽値で判定します。
- 構文:
値 instanceof クラスオブジェクト - 型の絞り込み:
if (customer instanceof User)のように条件分岐に用いると、そのブロック内では変数の型がUserクラスのインスタンスに絞り込まれ、特有のプロパティにアクセスできるようになります。 - 注意点: TypeScriptの「構造的部分型」の流儀においては、「クラスであること」に依存したロジック(
instanceofの多用)は推奨されません。型システム上でデータを表現・判定する別のアプローチを用いるのが理想的です。