Какие модификаторы классов есть в TypeScript
Что проверяют
Знаете ли вы не только public, private и protected, но и то, что модификаторы TypeScript живут до компиляции, а в JavaScript остаётся совсем другое. Следом обычно спрашивают разницу между private и #private и зачем нужен override.
Как отвечать
Модификаторы членов класса:
public: действует по умолчанию, писать его явно нужно разве что для единообразия;protected: доступ в классе и наследниках. Конструктор сprotectedзапрещаетnewснаружи, но разрешает наследование;private: доступ только внутри класса, но лишь на этапе проверки типов. После компиляции это обычное свойство, а TypeScript пропускает даже обращениеobj["secret"];readonly: присвоить можно при объявлении или в конструкторе. Тоже только проверка типов, в рантайме поле изменяемое;static: член класса, а не экземпляра. Бывают иstatic-блоки инициализации;abstract: у класса запрещает создание экземпляров, у метода требует реализации в наследнике;override: явно помечает переопределение. С флагомnoImplicitOverrideбез него компилятор выдаст ошибку, и опечатка в имени метода не пройдёт незаметно;accessor: автоаксессор, пригождается для стандартных декораторов.
Параметры конструктора с модификатором (constructor(private readonly api: ApiClient)) сразу объявляют и присваивают поле.
Затем сравните с нативными приватными полями: #token приватен в рантайме, снаружи его не прочитать ни через скобки, ни через Object.keys. Выбирают #, когда важна настоящая изоляция, например в библиотеке.
Где спотыкаются
Думают, что private и readonly защищают данные в рантайме. После сборки это обычные свойства, их видно в консоли и в JSON.stringify.
Не знают про флаг erasableSyntaxOnly (TypeScript 5.8). Он запрещает параметры конструктора с модификаторами: это не стираемые типы, а генерация кода, и такой файл не запустится через встроенное в Node.js удаление типов.
Путают абстрактный класс с интерфейсом. Абстрактный класс может содержать реализацию и поля с модификаторами и остаётся в рантайме, а интерфейс исчезает при компиляции полностью.