りゅうじの学習blog

学習したことをアウトプットしていきます。

4/16 TypeScript 静的プロパティ・静的メソッド

静的プロパティ(static property)・静的メソッド(static method)

  • クラス宣言に含むことができる
  • インスタンスではなく、クラスそのものに属する
  • 通常のプロパティ・メソッドの宣言の前にstaticと付ければいい
class Person {
  static adminName: string = 'kohei';
  static getAdminUser() {
    return new Person(Person.adminName, 27);
  }
  constructor(public name: string, public age: number) {}
  greeting(this: Person) {
    console.log(`おはようございます、${this.name}でございます。年齢は${this.age}です。`)
  }
  incrementAge() {
    this.age += 1;
  }
}
console.log(Person.adminName);  // koheiと出力される
const admin = Person.getAdminUser(); 
console.log(admin.age);  // 27と出力される

// 以下はインスタンスからstaticプロパティにアクセスしているのでコンパイルエラーになる
const person = new Person('kohei', 27);
console.log(person.adminName);  // エラー adminNameはインスタンスからはアクセスできない
  • Person.adminName Person.getAdminUser() でアクセスできる
  • インスタンスからはアクセス不可能

readonly修飾子

読み取り専用のプロパティにできる。要するに、一度設定された後に、代入することはできなくなります。

class Person {
  constructor(public readonly name: string, public age: number) {}
  greeting(this: Person) {
    console.log(`おはようございます、${this.name}でございます。年齢は${this.age}です。`)
  }
  incrementAge() {
    this.age += 1;
  }
}

const person = new Person('yano', 27);
console.log(person);
person.name = 'haga'; // エラー nameは書き換え不可能
  • personをインスタンス化した時にnameプロパティはyanoで設定しています
  • person.name = ‘haga’ で書き換えようとしているがnameプロパティにはreadonly修飾子がついているのでエラーになります

この挙動ってprivate修飾子を使用したときと同じなので、private修飾子だけでいいのではないか?という疑問が浮かびました

private修飾子と readonly修飾子を同時に使うのはなぜか

よく、private readonlyと一緒に使われているのをnestJSの学習時に見受けられていましたが、privateだけでいいのではないかと思いました。(そもそも、用途が違うわけですが、private修飾子は、アクセスも読み取りも不可能にするわけなので、readonly修飾子でやりたいことも実現できるから、1つでいいのではないかという疑問です。)

なぜ2つ使う必要があるか

  • private修飾子はクラス外からはアクセス不可能ではあるが、クラス内からはアクセス可能
  • readonly修飾子はクラス外・クラス内問わずに書き換え不可能

結論

  • クラス外からの書き換え不可能だけを実現するのであれば、private修飾子のみでOK
  • private修飾子をつけた上で、クラス内での書き換えも不可能にしたい場合にreadonly修飾子もつける
  • private修飾子だけでは、クラス内での書き換えは可能なため、それを制御したい

参考

プロを目指す人のためのTypeScript入門