今回は3つのアクセス修飾子「public」「private」「protected」について簡単に解説したいと思います。これらを使いこなすことでより安全なプログラムを書くことができるようになります。ぜひこの機会にマスターしましょう。
アクセス修飾子とは
アクセス修飾子とは、メンバのアクセス範囲を限定的にすることができる機能です。
アクセス修飾子にはpublic/private/protectedの3つがあり、それぞれのアクセス修飾子を使い分けることでより安全なプログラムを書くことができます。
メンバとはクラス内に定義されている変数やメソッドの総称です。
以下のコードでは、変数fruitsnameとsay()メソッドがFruitsクラスのメンバということになります。
class Fruits {
fruitsname: string;
constructor(fruitsname: string) {
this.fruitsname = fruitsname;
}
say(): void {
console.log("私は" + this.fruitsname + "を食べたい");
}
}
public
publicはクラス外からのアクセスを許可します。つまり、全てのアクセスを許可するということと同じ意味合いになります。
またデフォルトはpublicになっているため、アクセス修飾子の記述を省略した場合はpublicと認識される点に注意しておきましょう。
では、publicを省略しない場合の記述を見ていきます。
class Fruits {
public fruitsname: string;
constructor(fruitsname: string) {
this.fruitsname = fruitsname;
}
public say(): void {
console.log("私は" + this.fruitsname + "を食べたい");
}
}

上記はFruitsクラスを定義したコードになります。そこにpublicな変数fruitsnameとメソッドsay()を定義しています。
このように記述することでクラス外からの呼び出しも可能になります。
publicを省略した記述は以下になります。
class Fruits {
fruitsname: string;
constructor(fruitsname: string) {
this.fruitsname = fruitsname;
}
say(): void {
console.log("私は" + this.fruitsname + "を食べたい");
}
}
private
privateはクラス内でのアクセスのみ許可します。
実際のコードで見てみましょう。以下はアクセス修飾子はpublicで定義しているため、クラス外部からの呼び出しに成功しています。
class Fruits {
constructor(public fruitsname: string) {
}
say(): void {
console.log("好きなフルーツは" + this.fruitsname + "です。")
}
}
var favorite = new Fruits("ぶどう");
console.log(favorite.fruitsname);
=> ぶどう

では、publicではなくprivate変数に修正してみましょう。すると以下のようなエラーが出力され、クラス外部からのアクセスができなくなっていますね。
class Fruits {
constructor(private _fruitsname: string) {
}
say(): void {
console.log("好きなフルーツは" + this._fruitsname + "です。")
}
}
var favorite = new Fruits("ぶどう");
console.log(favorite._fruitsname);
=> error TS2341: Property '_fruitsname' is private and only accessible within class 'Fruits'.
protected
protectedは継承されたクラス内でのみアクセスを許可します。
同様にコードで見ていきましょう。以下のように、Fruitsクラスを継承したAnotherFruitsクラスが定義されているとします。
class Fruits {
constructor(private _fruitsname: string) {
}
say(): void {
console.log("好きなフルーツは" + this._fruitsname + "です。")
}
}
class AnotherFruits extends Fruits {
private _color: string;
constructor(_fruitsname: string, _color: string) {
super(_fruitsname);
this._color = _color
}
say(): void {
super.say();
console.log("その色は" + this._color + "です。")
}
}

Fruitsクラス内に定義されている「_fruitsname」はprivate変数であるため、以下のように継承クラス内で呼び出そうとしてもエラーになってしまいます。
class Fruits {
↓ _fruitsnameはprivate変数である
constructor(private _fruitsname: string) {
}
say(): void {
console.log("好きなフルーツは" + this._fruitsname + "です。")
}
}
class AnotherFruits extends Fruits {
private _color: string;
constructor(_fruitsname: string, _color: string) {
super(_fruitsname);
this._color = _color
}
say(): void {
super.say();
↓ このように親クラスのprivate変数を呼び出そうとするがエラーになる。(error TS2341: Property '_fruitsname' is private and only accessible within class 'Fruits'.)
console.log("本当に" + this._fruitsname + "が食べたい。")
console.log("その色は" + this._color + "です。")
}
}
ここで活躍するのがアクセス修飾子の「protected」です。前述した通り、protectedは継承されたクラス内でのみアクセスを許可するので、今回のケースでは使用することができます。
class Fruits {
↓ protectedに変更
constructor(protected _fruitsname: string) {
}
say(): void {
console.log("好きなフルーツは" + this._fruitsname + "です。")
}
}
class AnotherFruits extends Fruits {
private _color: string;
constructor(_fruitsname: string, _color: string) {
super(_fruitsname);
this._color = _color
}
say(): void {
super.say();
console.log("本当に" + this._fruitsname + "が食べたい。")
console.log("その色は" + this._color + "です。")
}
}
まとめ
- アクセス修飾子とは、メンバのアクセス範囲を限定的にすることができる機能である。
- publicはクラス外からのアクセスを許可する
- privateはクラス内でのアクセスのみ許可する
- protectedは継承されたクラス内でのみアクセスを許可する
参考
アクセス修飾子(Access Modifiers):
https://typescript-jp.gitbook.io/deep-dive/future-javascript/classes
TypeScript でクラスを書くための初歩:
https://numb86-tech.hatenablog.com/entry/2020/02/21/144155
TypeScript アクセス修飾子:
https://qiita.com/a12345/items/384bff6aaeba288ad7f2
今回は3つのアクセス修飾子「public」「private」「protected」について解説しました。これらのアクセス修飾子を使いこなし、安全なプログラムを心がけていきましょう。