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入門