notitie

日々感じたことをメモ書き

TypeScriptのアクセス修飾子と省略形について調べてみた

はじめに

TypeScriptでよく目にする、privatepublicは一体何なんだという疑問を解消するために調べてみた。

なぜアクセス修飾子を使うのか

クラスのプロパティ/メソッドは、デフォルトでどこからでもアクセスができる。しかし、クラスの内部でだけ利用している情報( プロパティ)、機能(メソッド) に対して、無制限にアクセスできる状態は望ましくないので、これらの場合にアクセス修飾子をしてアクセスの制限を設定するわけである。

アクセス修飾子の種類

修飾子 概要
pubic クラスの外からも自由にアクセス可能(デフォルト値)
private 同じクラスからのみアクセス可能
protected 同じクラス、またはその派生クラスのメンバーからのみアクセス可能

コードを例に見てみる

class Person {
    private name: string;
    private sex: string;

    constructor (name: string, sex: string) {
        this.name = name;
        this.sex = sex;
    }

    public show(): string {
        return `${this.name}は${this.sex}です`;
    }
}

let p = new Person('太郎', '男性');
console.log(p.show());
//=>太郎は男性です。
console.log(p.name);
//=>エラー(アクセスできない)

console.log(p.name);でエラーになるのは、nameプロパティをprivate指定しているからである。
showメソッドにpublic修飾子がついてあるが、publicはデフォルトだから省略しても意味は変わらない。明示的に書くことで分かりやすいことがメリット。
ちなみに${this.name}と書いてある部分はテンプレート文字列という機能で、これについて解説した記事を書いたので分からなければぜひ読んでみて欲しい。

上のコードをさらに短く省略することもできる。それが以下のコードになる。

class Person {
    constructor (private name: string, private sex: string) {
    }
    public show(): string {
        return `${this.name}は${this.sex}`;
    }
}

let p = new Person ('優哉', '男');
console.log(p.show());

ポイントは、コンストラクターの引数にアクセス修飾子を付与する点である。
これは、引数name/sexをもとに、同名のprivateプロパティname/sexを生成&初期化しなさい、という意味になる。
コンストラクタは性質上、与えられた引数をもとにプロパティを初期化することがよくある。this.プロパティ名=引数のような形である。コンストラクタの引数にアクセス修飾子を付けるだけで、こんなにもコンパクトにできるので覚えておきたい。

プロパティ(オブジェクト)を初期化する理由について非常に分かりやすく説明している記事をみつけたので参考までに。

参考記事

TypeScriptのClassについて – 公式ドキュメント日本語訳 | maesblog