見出し画像

TypeScript 入門の記録(59)プロを目指す人のためのTypeScript入門(43)第5章TypeScriptのクラス(3)

2週連続して東京出張していましたが、今日は、自宅です。近所のラベンダーが、蕾をたくさんつけていて、ほんのり良い香りがします。今日は第5章「TypeScriptのクラス」の続き、クラスの型について学習します。

TypeScriptのクラスの型

先週まで、クラス宣言やクラス式の基本を学習してきました。TypeScriptの特徴である型システムの観点でクラスを理解したいと思います。

クラス宣言とインスタンスの型

クラス宣言は、クラスオブジェクトの値を作ると同時に、インスタンスの型を宣言します。式 new ClassName() の型は、ClassName 型です。これは、直感的で、違和感ありません。

// クラス宣言はインスタンスの型を作る
class User521 {
    name: string = "";
    age: number = 0;
    static readonly ADULT_AGE = 20;
    isAdult(): boolean {
        return this.age >= User521.ADULT_AGE;
    }
}

// OKの例
const uhyo521: User521 = new User521();

// これもOK
const john: User521 = {
    name: "John Smith",
    age: 15,
    isAdult: ()=> true
}
// これもOK
const john: User521 = {
    name: "John Smith",
    age: 15,
    isAdult: ()=> true
}

// これはOK
const uhyo522 = new User521();
// テキストには、これはエラーと書かれているがOK
const johnNG: User521 = new User521();
console.log(johnNG.isAdult());

new シグネチャによるインスタンス化可能性

クラスは「クラスオブジェクトが入った変数」を表していて、new クラスオブジェクト() という式でインスタンスが生成できます。クラスオブジェクトの型の記法には、new (引数リスト) => インスタンスの型という記法があります。

// クラスオブジェクトの型の記法
type MyUserConstructor = new () => User521;
// User521は、MyUserConstructor型を持つ
const MyUser: MyUserConstructor = User521;
// MyUser はnew で使用可能
const u521 = new MyUser();
// u521 は、MyUser型を持つ
console.log(`u521.name = ${u521.name}, u521.age = ${u521.age}`);

実行結果は、

u521.name = , u521.age = 0

instanceof演算子と型の絞り込み

与えられたオブジェクトが、特定のクラスのインスタンスかどうかを判断する instanceof 演算子があります。値 instanceof クラスオブジェクト という構文です。結果は、対象のクラスオブジェクトのインスタンスかどうかをbooleanで返却します。

// instanceof演算子
// u521 は User521 のインスタンスか
console.log(`u521 instanceof User521 = ${u521 instanceof User521}`);
// {} は、Uer521のインスタンスではない
console.log(`{} instanceof User521 = ${{} instanceof User521}`);

const john: User521 = {
    name: "John Smith",
    age: 15,
    isAdult: ()=> true
}

// john は、User521 のインスタンスではない
console.log(`john instanceof User521 = ${john instanceof User521}`);

実行結果は、

u521 instanceof User521 = true
{} instanceof User521 = false
john instanceof User521 = false

instanceof演算子は、その変数の型を判定するのではなく、その変数がクラスのインスタンスとして生成されているかどうかを判定するところに注意が必要だと思いました。instanceof 演算子を使って、対象クラスのインスタンスの場合だけ追加処理をするような制御ができます。

まとめ

今週は、クラスの型について学習しました。クラスオブジェクトとインスタンスの関係については、ざっくり理解できたと思いますが、クラスオブジェクトからインスタンスを生成することを表す記法 new (引数リスト) => インスタンスの型 は、関数型と似ているので混乱しそうです。馴染むまで繰り返しコードを書いたりして、しっかり身につけたいと思います。今日の学習はここまでにします。この続きは次の週末の予定です。


いいなと思ったら応援しよう!