Typescript アクセス修飾子
2021/08/30
初心者向けにTypescriptのアクセス修飾子に関して簡単にまとめておきます。
- public (どこからでも参照可能)
- private (自class内でのみ参照可能)
- protected (自classおよび継承先class内でのみ参照可能)
public
デフォルトのアクセス修飾子です。 変数やmethodの前に何も書かない場合はこのpublicが適用されます。 class内だけではなく外部からも参照可能です。
public
class BaseClass {
a: string; // public
public b: string; // public
constructor(a: string, b: string) {
this.a = a;
this.b = b;
}
}
const baseClass = new BaseClass('a', 'b');
console.log(baseClass.a) // -> a
console.log(baseClass.b) // -> b
private
privateがついた変数やmethodはそのclass内でしか参照できません。
private
class BaseClass {
private a: string; // private
constructor(a: string) {
this.a = a;
}
showA() {
console.log(this.a); // -> a
}
}
const baseClass = new BaseClass('a');
console.log(baseClass.a); // -> 自Class内でしか参照できないのでError
protected
protectedはprivateと同様に外部からの参照は不可ですが、 privateが自classからのみしか参照できないのに対し、protectedは継承先classからでも参照可能です。
protected
// 継承元class
class BaseClass {
private a: string; // private
protected b: string; // protected
constructor(a: string, b: string) {
this.a = a;
this.b = b;
}
}
// 継承先class
class ExtendedClass extends BaseClass {
constructor(a: string, b: string) {
super(a, b) // BaseClassのcostructor呼び出し
}
showA() {
console.log(this.a); // -> privateは継承先からでも参照不可のためError
}
showB() {
console.log(this.b); // -> b
}
}
補足
readonly
上記のアクセス修飾子以外にはreadonlyがあります。 readonlyはその名の通り、読み込み専用を意味する修飾子であり、これがついた変数に対しては再代入などはできません。
readonly
class BaseClass {
private readonly a: string;
constructor(a: string) {
this.a = a;
}
setA() {
this.a = 'new a'; // -> 読み取り専用なので再代入不可
}
}
Parameters Property記法
constructorは以下のような書き方をすることで、classのプロパティとconstructorの引数を同時に定義することが可能です。 (NestJSはデフォルトでこの書き方をする場合が多い) constructor内の引数にアクセス修飾子をつけた場合はそのclassのプロパティも同時に定義できていると覚えておくと便利です。
ParametersProparty
// ↓このclassは
class BaseClass {
private a: string;
public b: string;
constructor(a: string, b: string) {
this.a = a;
this.b = b;
}
}
// ↓こう書ける!!!
class BaseClass {
constructor(private a: string, public b: string) {}
}
おわり
意外と定義を曖昧に覚えてる人も多い... 🍙 重要ですアクセス修飾子 💪