thumbnail

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) {}
}

おわり

意外と定義を曖昧に覚えてる人も多い... 🍙 重要ですアクセス修飾子 💪

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

Profile

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

© 2022 mitsuru takahashi