TypeScriptのアクセス修飾子(public、private、protected)について、実践的な使い方と意味を詳しく解説します。

publicアクセス修飾子

publicは最もオープンなアクセス修飾子で、クラスの内部からもクラスの外部からもアクセスが可能です。実は明示的に指定しなくても、デフォルトでpublicとして扱われます。

class User {
    public name: string;
    
    constructor(name: string) {
        this.name = name;
    }
}

const user = new User("John");
console.log(user.name); // "John" - 外部からアクセス可能

privateアクセス修飾子

privateは最も制限の強いアクセス修飾子で、そのクラス内でのみアクセスが可能です。外部からのアクセスは完全に遮断されます。

class BankAccount {
    private balance: number;
    
    constructor(initialBalance: number) {
        this.balance = initialBalance;
    }
    
    public getBalance(): number {
        return this.balance;
    }
}

const account = new BankAccount(1000);
// console.log(account.balance); // エラー:'balance'はprivateなので外部からアクセス不可
console.log(account.getBalance()); // 1000 - メソッド経由でアクセス可能

protectedアクセス修飾子

protectedは中間的なアクセス修飾子で、そのクラスと継承したサブクラスからのアクセスが可能です。外部からは直接アクセスできません。

class Animal {
    protected type: string;
    
    constructor(type: string) {
        this.type = type;
    }
}

class Dog extends Animal {
    bark() {
        console.log(`${this.type} is barking`); // protectedなのでアクセス可能
    }
}

const dog = new Dog("Husky");
// console.log(dog.type); // エラー:'type'はprotectedなので外部からアクセス不可
dog.bark(); // "Husky is barking"

コンストラクタでの省略記法

TypeScriptでは、コンストラクタのパラメータにアクセス修飾子を付けることで、プロパティの宣言と初期化を簡潔に書くことができます。

class Employee {
    constructor(
        private id: number,
        public name: string,
        protected department: string
    ) {}
}

// 上記は以下と同じ意味
class Employee {
    private id: number;
    public name: string;
    protected department: string;
    
    constructor(id: number, name: string, department: string) {
        this.id = id;
        this.name = name;
        this.department = department;
    }
}

アクセス修飾子の使い分け

  • `public`: クラスの外部に公開したいプロパティやメソッド
  • `private`: クラス内部でのみ使用し、外部に公開したくないプロパティやメソッド
  • `protected`: 継承先のクラスでも使用したいが、外部には公開したくないプロパティやメソッド

これらのアクセス修飾子を適切に使い分けることで、カプセル化を実現し、より安全で保守性の高いコードを書くことができます。

まとめ

TypeScriptのアクセス修飾子は、オブジェクト指向プログラミングの重要な概念であるカプセル化を実現するための強力なツールです。適切なアクセス修飾子を選択することで、コードの安全性と保守性を向上させることができます。特に大規模なアプリケーション開発では、これらの機能を活用することで、より堅牢なコードベースを構築することができます。