技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

TypeScriptでのクラスの取り扱い方について

// 継承にのみ利用できるクラスにはabstractを利用
abstract class Person {
  // インスタンス作らずにクラスを使う場合はstaticを利用する
  // 例 Person.species
  static species = 'Homo sapiens';
  // インスタンス作らずにクラスを使う場合はstaticを利用する
  // 例 Person.isAdult(38)
  static isAdult(age: number) {
    if (age > 17) return true;
    return false;
  }
  // constructorで初期化できる
  // 書き換えできないようにするにはreadonly
  // 継承先のみでアクセスできるようにするにはprotectedにする
  constructor(readonly name: string, protected age: number) {
  }
  // メソッド追加もできる
  incrementAge() {
    this.age += 1;
  }
  // クラスを型に定義することもできる
  greeting(this: Person) {
    console.log(`Hello! My name is ${this.name}. I am ${this.age} years old.`);
    this.explainJob();
  }
  abstract explainJob(): void;
}

// Classはオブジェクトの設計図(Classから作成されたオブジェクトはインスタンスになる)
// extendsでPersonを継承できる
class Teacher extends Person {
  private static instance: Teacher;

  explainJob() {
    console.log(`I am a teacher and I teach ${this.subject}.`);
  }

  // ゲッター処理
  get subject(): string {
    if (!this._subject) {
      throw new Error('There is no subject.');
    }
    return this._subject;
  }

  // セッター処理
  set subject(value) {
    if (!value) {
      throw new Error('There is no subject.');
    }
    this._subject = value;
  }
  // クラスの外側で変更できない場合はprivateにする
  // privateをつけるとシングルトンパターンになって、インスタンスを一つしか利用できないようにする事が可能
  private constructor(name: string, age: number, private _subject: string) {
    // 親クラスのconstructorを引き継ぐ
    super(name, age);
  }
  static getInstance() {
    if (Teacher.instance) return Teacher.instance;
    // newでTeacherクラスのインスタンスを作成する
    Teacher.instance = new Teacher('Quill', 38, 'Math');
    return Teacher.instance;
  }
}
const teacher = Teacher.getInstance();
const teacher2 = Teacher.getInstance();
console.log(teacher, teacher2);