仕事ですぐに使えるTypeScript その10

目的

学習の記録と学びになった部分をアウトプットするため。

期限

対象書籍の読了・内容理解が8月中に完了していること。

対象

今回の対象は「クラス」。

future-architect.github.io

著作権者:フューチャー株式会社(Future Corporation)様

クラス

  • javascirptのクラスは下記のように表現することができる。
class Animal {
    // プロパティ
    animalType: string;

    // コンストラクタ
    constructor() {
        this.animalType = "大型"
    }

    say() {
        console.log(`${this.animalType} の種類の動物です。`);
    }
}

const a = new Animal();
a.say();
// > の種類の動物です。

アクセス制御

  • TypeScriptにはpublic, protected, public装飾子がある。
  • 特に装飾子を付けない場合は、publicとなる。
  • privateは定義があるクラス以外からの呼び出し禁止、protectedは定義があるクラスとその子クラスからのみ呼び出し可能。
  • 昔は変数の前に_(アンスコ)を付けて仕組み上はアクセスできるけど使用しないようにする等、トリックを使ってprivateの宣言を再現しようとしていた。
  • protectedは用意されているけど、typescriptで階層が深くなる継承をすることはあまりないので使うことはない。
class Cat {
    private food: string;
    private place: string;

    dig() {
        return `${this.place}を掘って${this.food}を見つける`;
    }

    bury(f: string, p: string) {
        this.food = f;
        this.place = p;
    }
}

const cat = new Cat();

cat.bury("魚", "空き地");

console.log(cat.dig());
// > 空き地を掘って魚を見つける

 コンストラク

  • 認識の通り

static メンバー

  • 基本的な概念は認識通り。
  • staticを使用するのは、インスタンスを作る特別なファクトリーメソッドを実装するぐらいらしい。

継承/インターフェース宣言

  • 継承の記載方法は下記の通り。
class Cat {
    eat() {
        console.log("餌の量は100gです");
    }

    walk() {
        console.log("歩く")
    }
}

class smallCat extends Cat{
    eat() {
        console.log("餌の量は50gです");
    }
}

const tama = new smallCat();
tama.eat();
// > 餌の量は50gです
tama.walk();
// > 歩く

const cat = new Cat();
cat.eat();
// > 餌の量は100gです
cat.walk();
// > 歩く
  • interfaceの実装方法は下記の通り。
interface Animal {
    eat();
    walk();
    sleep(): void; // 返り値がない場合はvoidを付けたりすることも可能。
}

class Cat implements Animal {
    eat() {
        console.log("餌の量は100gです");
    }

    walk() {
        console.log("歩く")
    }

    sleep() {
        console.log("眠る")
    }
}

クラスとインターフェースの違い・使い分け

違いは下記の通り。

  • interfaceはnewでインスタンスを作ることはできないが、クラスはできる。
  • インターフェースはインスタンスを作成できないので、コンストラクタを定義できない。
  • インタフェースはpublicメンバーしか定義することはできないが、クラスは他のアクセス制御(protected, private)が可能。