TypeScript アクセス修飾子

概要: このチュートリアルでは、private、protected、publicを含むTypeScriptのアクセス修飾子について学習します。

アクセス修飾子は、クラスのプロパティとメソッドの可視性を変更します。TypeScriptは3つのアクセス修飾子を提供します。

  • private
  • protected
  • public

TypeScriptは、実行時ではなく、コンパイル時に論理的にアクセスを制御することに注意してください。

private修飾子

private修飾子は、可視性を同じクラスのみに制限します。プロパティまたはメソッドにprivate修飾子を追加すると、同じクラス内でそのプロパティまたはメソッドにアクセスできます。クラスの外からprivateプロパティまたはメソッドにアクセスしようとすると、コンパイル時にエラーが発生します。

次の例は、personクラスのsnnfirstNamelastNameプロパティにprivate修飾子を使用する方法を示しています。

class Person {
  private ssn: string;
  private firstName: string;
  private lastName: string;

  // ...
}Code language: TypeScript (typescript)

privateプロパティが設定されると、Personクラスのコンストラクタまたはメソッドでssnプロパティにアクセスできます。例えば

class Person {
  private ssn: string;
  private firstName: string;
  private lastName: string;

  constructor(ssn: string, firstName: string, lastName: string) {
    this.ssn = ssn;
    this.firstName = firstName;
    this.lastName = lastName;
  }

  getFullName(): string {
    return `${this.firstName} ${this.lastName}`;
  }
}Code language: TypeScript (typescript)

次の例は、クラスの外からssnプロパティにアクセスしようとしています。

let person = new Person('153-07-3130', 'John', 'Doe');
console.log(person.ssn); // compile errorCode language: TypeScript (typescript)

public修飾子

public修飾子を使用すると、クラスのプロパティとメソッドはすべての場所からアクセスできます。プロパティとメソッドにアクセス修飾子を指定しない場合、デフォルトでpublic修飾子が適用されます。

たとえば、PersonクラスのgetFullName()メソッドにはpublic修飾子が付いています。次の例では、getFullName()メソッドにpublic修飾子を明示的に追加しています。

class Person {
    // ...
    public getFullName(): string {
        return `${this.firstName} ${this.lastName}`; 
    }
    // ...
}Code language: TypeScript (typescript)

これは、publicキーワードを省略した場合と同じ効果があります。

protected修飾子

protected修飾子を使用すると、クラスのプロパティとメソッドは、同じクラスとサブクラス内からアクセスできます。

あるクラス(子クラス)が別のクラス(親クラス)を継承する場合、それは親クラスのサブクラスです。

他の場所からprotectedプロパティまたはメソッドにアクセスしようとすると、TypeScriptコンパイラはエラーを発行します。

プロパティまたはメソッドにprotected修飾子を追加するには、protectedキーワードを使用します。例えば

class Person {
    protected ssn: string;
    
    // other code
}
Code language: TypeScript (typescript)

ssnプロパティはこれでprotectedになります。Personクラス内と、Personクラスを継承するクラス内からアクセスできます。継承についてはここで詳しく説明しています。

Personクラスは2つのprivateプロパティと1つのprotectedプロパティを宣言しています。そのコンストラクタはこれらのプロパティを3つの引数に初期化します。

class Person {
  protected ssn: string;
  private firstName: string;
  private lastName: string;

  constructor(ssn: string, firstName: string, lastName: string) {
    this.ssn = ssn;
    this.firstName = firstName;
    this.lastName = lastName;
  }

  getFullName(): string {
    return `${this.firstName} ${this.lastName}`;
  }
}Code language: TypeScript (typescript)

コードを短くするために、TypeScriptでは次のようにコンストラクタ内でプロパティを宣言して初期化することができます。

class Person {
  constructor(
    protected ssn: string,
    private firstName: string,
    private lastName: string
  ) {}

  getFullName(): string {
    return `${this.firstName} ${this.lastName}`;
  }
}Code language: TypeScript (typescript)

プロパティとメソッドの可視性を考慮する際には、最も可視性の低いアクセス修飾子であるprivateから始めるのが良い方法です。

概要

  • TypeScriptは、クラスのプロパティとメソッドに3つのアクセス修飾子を提供します。privateprotectedpublicです。
  • private修飾子は、同じクラス内からのアクセスを許可します。
  • protected修飾子は、同じクラスとサブクラス内からのアクセスを許可します。
  • public修飾子は、任意の場所からのアクセスを許可します。
  • アクセス修飾子を省略した場合、プロパティとメソッドはpublicアクセスになります。
このチュートリアルは役に立ちましたか?