Что такое модификаторы доступа (public, private, protected) в TypeScript?
В TypeScript модификаторы доступа позволяют управлять видимостью и доступностью свойств и методов внутри классов. Они не влияют напрямую на работу JavaScript-кода на этапе выполнения, так как после компиляции в JS эти ограничения исчезают, но обеспечивают контроль на этапе разработки, помогая строить более надёжную и безопасную архитектуру.
Public
public — это модификатор доступа по умолчанию. Свойства и методы с этим модификатором доступны из любой части программы: внутри класса, в его наследниках и за пределами класса.
class User {
public name: string;
constructor(name: string) {
this.name = name;
}
}
const user = new User("Alex");
console.log(user.name); // доступен напрямую
Использовать public необязательно, так как если модификатор не указан, свойство или метод считаются публичными.
Private
private ограничивает доступ только самим классом. Свойства и методы с этим модификатором нельзя вызывать или изменять извне и даже в классах-наследниках. Это полезно для инкапсуляции данных и предотвращения прямого вмешательства в работу класса.
class BankAccount {
private balance: number;
constructor(initialBalance: number) {
this.balance = initialBalance;
}
deposit(amount: number): void {
this.balance += amount;
}
getBalance(): number {
return this.balance;
}
}
const account = new BankAccount(100);
// account.balance; // Ошибка: свойство private
console.log(account.getBalance()); // доступ через метод
Таким образом, private помогает скрывать внутреннее состояние объекта и предоставлять доступ только через определённые методы.
Protected
protected похож на private, но с важным отличием: такие свойства и методы доступны внутри самого класса и его наследников. Однако они недоступны за пределами иерархии классов.
class Employee {
protected position: string;
constructor(position: string) {
this.position = position;
}
}
class Manager extends Employee {
getRole(): string {
return \`Manager role: ${this.position}\`;
}
}
const manager = new Manager("Team Lead");
console.log(manager.getRole());
// manager.position; // Ошибка: свойство protected
Это особенно удобно, когда необходимо дать доступ к данным наследникам, но скрыть их от внешнего кода.
Сочетание с readonly
Модификаторы доступа можно сочетать с readonly, чтобы запретить изменение значения свойства после инициализации.
class Product {
constructor(
public readonly id: number,
private price: number
) {}
getPrice(): number {
return this.price;
}
}
В этом примере id — публичное свойство, доступное извне, но изменить его нельзя, а price полностью инкапсулирован внутри класса.