Классы и модификаторы доступа
Классы в TypeScript и контроль доступа к их полям через модификаторы.
Модификатор доступа определяет, откуда видно поле или метод:
public,privateилиprotected.
Класс в TypeScript
Синтаксис классов почти как в JavaScript, но поля типизированы, а их можно объявлять явно:
class Counter {
count: number;
constructor(start: number) {
this.count = start;
}
increment(): void {
this.count++;
}
}
const c = new Counter(10);
c.increment();
console.log(c.count); // 11
Поле count объявлено с типом, конструктор принимает типизированный аргумент, метод — типизированный возврат. Компилятор следит, чтобы всё сходилось.
private — инкапсуляция
Главная польза классов — спрятать внутреннее устройство. Модификатор private делает поле доступным только внутри класса:
class BankAccount {
private balance: number = 0;
deposit(amount: number): void {
this.balance += amount;
}
getBalance(): number {
return this.balance;
}
}
const acc = new BankAccount();
acc.deposit(100);
console.log(acc.getBalance()); // 100
acc.balance = 1_000_000; // Ошибка: Property 'balance' is private.
Снаружи нельзя напрямую переписать balance — только через метод deposit, где можно проверить сумму. Это и есть инкапсуляция: данные защищены, доступ контролируется.
Три уровня доступа
| Модификатор | Откуда виден |
public | отовсюду (по умолчанию) |
private | только внутри этого класса |
protected | внутри класса и его наследников |
Без модификатора поле считается public. protected — нечто среднее: скрыто снаружи, но доступно в дочерних классах (об этом — в уроке про наследование).
readonly в классах
Модификатор readonly работает и в классах: поле задаётся в конструкторе и больше не меняется. Его часто сочетают с уровнем доступа:
class User {
readonly id: number;
private readonly createdAt: Date;
constructor(id: number) {
this.id = id;
this.createdAt = new Date();
}
}
const u = new User(1);
u.id = 2; // Ошибка: Cannot assign to 'id' because it is a read-only property.
Зачем это: защита от ошибок в большом коде
Модификаторы — не просто формальность. В крупном проекте они не дают другому разработчику (или вам через полгода) случайно залезть во внутреннее состояние объекта в обход правил. Компилятор делает нарушение контракта невозможным ещё до запуска.
Итог
- Классы в TypeScript — как в JS, но с типизированными полями, аргументами и возвратами.
privateскрывает поле внутри класса,protected— внутри класса и наследников,public(по умолчанию) — отовсюду.readonlyделает поле неизменяемым после конструктора; модификаторы защищают инкапсуляцию на этапе компиляции.