TypeScript

【TypeScript】public / protected / private を使いクラスへのアクセスを制御する

TypeScript logo

今日は、TypeScriptでクラスへのアクセスを制御することが可能になる public / protected / private を整理する。これらは、「Access Modifiers(アクセス修飾子)」と呼ばれる。

基本用語を整理

  • public:すべてのアクセスを許可。と言う事で、基本的につけても、つけなくても結果は変わらない。
  • private:定義があるクラス以外からのアクセスを禁止。
  • protected: 定義のあるクラスと子クラス以外からのアクセスを禁止。つまり、継承(extends)を前提として使用する。

コード例(コメントで解説)

// 新しいCompanyというクラスを定義
class Company {
    // nameというプロパティを設定。型はstring
    public name: string;

    // employeesというプロパティを設定。型はArray of string. 初期値は空のArray
    private employees: string[] = [];

    // コンストラクタ。あとで、クラスを元にインスタンス化する際にnameを渡せるようにしておく。
    constructor(name: string) {
        this.name = name
    }

    // getStatusメソッドを定義。
    getStatus(this: Company) {
        console.log(`${this.name} has ${this.employees.length} employees`)
    }

    // addEmployeesメソッドを定義。
    addEmployees(employee: string) {
        this.employees.push(employee)

    }
}

//初期化
const doyota = new Company('Doyota')

//エラー。 private でアクセス制御しているので、定義のあるクラスの外からはアクセスできない。
//Property 'employees' is private and only accessible within class 'Company'.
doyota.employees.push('wata') 

doyota.addEmployees('Ichiro')
doyota.addEmployees('Jiro')
console.log(doyota.getStatus()) //"Doyota has 2 employees"

const doyotaCopy = { getStatus: doyota.getStatus}

// getStatus(this: Company) { ~省略~} と、ダミーのパラメターを型定義しているので、
// Typescriptがエラーを掃き出してくれる。 doyotaCopyにはnameがないので。
// The 'this' context of type '{ getStatus: (this: Company) => void; }' is not assignable to method's 'this' of type 'Company'.
// Type '{ getStatus: (this: Company) => void; }' is missing the following properties from type 'Company': name, employees, addEmployees
doyotaCopy.getStatus();

 

まとめ

今日紹介した、クラスに関わるアクセス制御は基本的なとこなので、しっかりと理解してきたい。次回は、クラスに関連して、static, readonly を紹介する予定。

ABOUT ME
Wata
30歳で営業職からエンジニアに転職した者のブログです。 大手海運業→総合商社→ソフトウエアエンジン。現在は、オーストラリアにてエンジニアとして働いています。 未経験からのエンジニアへの転職、フロントエンド周りの技術、エンジニアの仕事環境、趣味の旅行、JAL修行、オーストラリアの情報などを発信しています!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です