Классы и модификаторы доступа

Классы в 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 делает поле неизменяемым после конструктора; модификаторы защищают инкапсуляцию на этапе компиляции.
Проверьте себя
1. Откуда доступно поле, помеченное private?
AОтовсюду
BТолько внутри самого класса
CВнутри класса и его наследников
DТолько из конструктора
2. Какой модификатор доступа у поля, если он не указан явно?
Aprivate
Bpublic
Cprotected
Dreadonly
3. В чём практическая польза private-полей в большом проекте?
AОни ускоряют работу класса
BОни защищают внутреннее состояние: снаружи нельзя обойти методы и испортить данные
CОни уменьшают размер скомпилированного кода
DОни делают поля необязательными
Поддержать проект