Что такое public в TypeScript?
Что проверяют
Знаете ли вы, что модификаторы доступа в TypeScript живут только на этапе компиляции, и отличаете ли их от настоящей приватности в JavaScript. Вопрос звучит просто, поэтому отвечать лучше на уровень глубже определения.
Как отвечать
public это модификатор доступа, при котором поле или метод виден отовсюду. Он же поведение по умолчанию: без модификатора член класса уже публичен, явно его пишут ради единообразия или ради параметр-свойства в конструкторе.
Параметр-свойство это главная практическая польза ключевого слова: модификатор у аргумента конструктора разом объявляет поле и присваивает его.
class Counter {
#value = 0;
constructor(public readonly step: number) {}
increment(): number {
this.#value += this.step;
return this.#value;
}
}Дальше важное противопоставление. private и protected проверяет только компилятор, в выданном JavaScript поле обычное и читается из консоли браузера, а приведение через as any снимает запрет прямо в коде. Настоящая приватность это поля с решёткой: они недоступны снаружи в рантайме и не попадают в перебор ключей.
Пара уточнений, которые любят спросить следом: в интерфейсах и объектных типах модификатор писать нельзя, там все члены публичны по определению; private и protected участвуют в совместимости типов, поэтому два структурно одинаковых класса несовместимы, если приватное поле объявлено в каждом своё.
Где спотыкаются
Считают модификаторы защитой данных. Ключ, спрятанный в приватное поле фронтенда, всё равно уезжает в бандл и находится поиском по исходникам; разграничение доступа существует на сервере, а в классе это подсказка коллеге, а не барьер.
Путают public с readonly и ждут неизменяемости. readonly тоже стирается при компиляции и запрещает присваивание только в типах, ничего не замораживая в рантайме. Для реальной неизменяемости нужен Object.freeze или отказ отдавать наружу ссылку на объект.
Ставят модификатор там, где он не разрешён, или наоборот считают, что без него член приватный. Первое даёт ошибку компиляции, второе приводит к классу, у которого наружу торчит всё внутреннее состояние и который потом нельзя менять.