> Какие модификаторы классов есть в TypeScript (TypeScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: ЛОЦИЯ

Стек: TypeScript

> Пример ответа

Короткий ответ

В TypeScript есть три модификатора доступа: public, protected и private. public - доступен везде (по умолчанию), protected - внутри класса и в наследниках, private - только внутри класса. Также есть readonly для запрета перезаписи, static для принадлежности классу, а не экземпляру, и abstract для классов, которые нельзя инстанциировать напрямую.

Подробное объяснение

Модификаторы в TypeScript делятся на три группы: модификаторы доступа, модификаторы поведения и модификаторы наследования.

Модификаторы доступа:

  • public - свойство или метод доступны из любого места. Это значение по умолчанию, его можно не указывать.
  • protected - доступны внутри класса и в его подклассах, но не снаружи.
  • private - доступны только внутри самого класса. В TypeScript есть два вида private: стандартный (через ключевое слово) и ECMAScript private fields (через #). Стандартный private работает только на этапе компиляции и не влияет на рантайм, а # - это нативный JS-синтаксис, который защищает поле на уровне движка.

Модификаторы поведения:

  • readonly - запрещает перезапись свойства после инициализации. Работает только на уровне TypeScript, в скомпилированном JS его нет.
  • static - свойство или метод принадлежат самому классу, а не экземпляру. Доступны через ClassName.property.
  • abstract - для классов и методов. Абстрактный класс нельзя инстанциировать, он служит базой для наследования. Абстрактные методы должны быть реализованы в подклассах.

Параметры конструктора с модификаторами: TypeScript позволяет объявлять и инициализировать свойства прямо в параметрах конструктора, добавляя модификатор. Это сокращает код: constructor(public name: string) автоматически создаёт и присваивает свойство this.name.

Особенности:

  • Модификаторы доступа в TypeScript - это compile-time проверки. В скомпилированном JavaScript их нет, поэтому на рантайме можно обратиться к private полю через obj['field'].
  • Для настоящей приватности на уровне рантайма используйте # (ES private fields).
  • protected в TypeScript также не даёт защиты на рантайме.

На практике

На собеседовании для senior-уровня важно не просто перечислить модификаторы, а показать понимание их ограничений и trade-off. Например, почему в некоторых проектах предпочитают # вместо private, или как readonly помогает в иммутабельности данных.

Типичные сценарии:

  • Использование protected в базовых классах для методов, которые должны быть переопределены в наследниках.
  • readonly для DTO и конфигураций, чтобы гарантировать неизменность после создания.
  • static для фабричных методов или синглтонов.
  • abstract для построения иерархии классов с обязательной реализацией.

Практический совет: для value objects и моделей данных часто используют readonly вместе с public, чтобы данные были доступны, но не изменяемы извне.

Пример кода

TYPESCRIPT
abstract class Animal {
constructor(public readonly name: string, protected age: number) {}
abstract makeSound(): void;
static create(name: string): Animal {
// фабричный метод
return new Dog(name, 0);
}
}
class Dog extends Animal {
private #owner: string;
constructor(name: string, age: number, owner: string) {
super(name, age);
this.#owner = owner;
}
makeSound(): void {
console.log(`${this.name} says woof`);
}
getOwner(): string {
return this.#owner;
}
}
const dog = new Dog('Rex', 3, 'Alice');
dog.name; // доступно, readonly
// dog.name = 'Max'; // ошибка
// dog.age; // ошибка, protected
// dog.#owner; // ошибка, приватное поле

Как отвечать на собеседовании

Начни с чёткого перечисления всех модификаторов, затем углубись в детали. Покажи понимание разницы между private и #, упомяни, что модификаторы доступа - это только compile-time. Для senior-уровня добавь про использование readonly в функциональном стиле и про abstract для проектирования API. Если спросят про protected - объясни, когда это оправдано, а когда лучше композиция.

Что проверяет интервьюер

  • Знание синтаксиса и семантики модификаторов.
  • Понимание разницы между compile-time и runtime защитой.
  • Умение выбирать подходящий модификатор под задачу.
  • Осведомлённость о современных подходах (ES private fields).
  • Навыки проектирования классов с использованием abstract и static.

Типичные ошибки

  • Путать private в TypeScript с настоящей приватностью в JavaScript.
  • Думать, что protected защищает от доступа на рантайме.
  • Использовать public везде по умолчанию, не задумываясь об инкапсуляции.
  • Забывать, что readonly не делает объект глубоко иммутабельным.
  • Пытаться инстанциировать абстрактный класс.
  • Не использовать параметры конструктора с модификаторами для сокращения кода.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью