今日は、TypeScriptでクラスへのアクセスを制御することが可能になる public / protected / private を整理する。これらは、「Access Modifiers(アクセス修飾子)」と呼ばれる。
Contents
基本用語を整理
- 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