TypeScript має модифікатори доступу public, protected, private:
public(за замовчуванням) - доступно всім;protected- класу й нащадкам;private- лише самому класу.
class Account {
private balance = 0;
protected currency = 'UAH';
#pin = '1234'; // приватне поле JavaScript
}
Ключова різниця - коли діє обмеження.
private TypeScript - лише перевірка компілятора. Після компіляції це звичайна властивість об'єкта: вона видна в Object.keys, у JSON.stringify, доступна з JavaScript-коду. Навіть у TypeScript є лазівка - доступ через квадратні дужки:
const account = new Account();
account.balance; // помилка компіляції
account['balance']; // дозволено - навмисна «аварійна дверцята»
#private - справжня приватність під час виконання. Поле недосяжне ззовні класу в принципі: ні через дужки, ні через Object.keys, ні через рефлексію. Спроба звернутися до #pin поза класом - синтаксична помилка JavaScript.
Коли що обирати:
#private- коли потрібна гарантія: бібліотеки, код, який використовують з JavaScript, дані, що не повинні потрапити в серіалізацію;private- якщо достатньо перевірки на етапі компіляції й потрібна гнучкість: тести, що зазирають у стан, сумісність зі старим кодом, бібліотеки, яким потрібен доступ до полів (ORM, серіалізатори).
Нюанси #private:
#field in obj- перевірка, що об'єкт створено цим класом;- приватні поля не працюють через
Proxy(Vuereactive, MobX): метод, викликаний на проксі, падає зTypeError; protectedаналога в JavaScript не має - лише перевірка TypeScript.
readonly - окремий модифікатор: поле можна присвоїти лише при оголошенні чи в конструкторі. Теж діє тільки під час компіляції.