> Какие модификаторы классов есть в 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, чтобы данные были доступны, но не изменяемы извне.
Пример кода
TYPESCRIPTabstract 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не делает объект глубоко иммутабельным. - Пытаться инстанциировать абстрактный класс.
- Не использовать параметры конструктора с модификаторами для сокращения кода.
> Похожие задачи по frontend
Где и как прописать аннотацию типа в TypeScript
Какова роль юнит тестов при использовании TypeScript
Как реализовать динамически настраиваемое поле в интерфейсе TypeScript
Какие сущности TypeScript остаются в рантайме после транспиляции
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью