Skip to main content

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

TypeScript підтримує кілька модифікаторів доступу (access modifiers), які дозволяють керувати видимістю властивостей і методів у класах. Вони потрібні для інкапсуляції - щоб обмежити доступ до внутрішніх даних об'єкта.


Основні модифікатори доступу

МодифікаторДе видноКлючове слово
publicСкрізь (за замовчуванням)public
privateЛише всередині того самого класуprivate
protectedУсередині класу та його наслідниківprotected
readonlyЛише для читання, не можна змінити після ініціалізаціїreadonly (не зовсім про доступ, але часто використовується разом)

1. public - публічний доступ (за замовчуванням)

Усі члени класу за замовчуванням public, навіть якщо модифікатор не вказано.

javascript
class User { public name: string; // можна не писати public - це дефолт constructor(name: string) { this.name = name; } public greet() { console.log(`Hello, ${this.name}`); } } const u = new User("Tim"); u.name = "Alex"; // доступ ззовні u.greet(); // можна викликати

public означає: властивість або метод доступні скрізь - всередині класу, в наслідниках, за межами класу.


2. private - приватні поля та методи

private робить властивість або метод недоступними за межами класу, навіть для наслідників.

javascript
class Account { private balance: number = 0; deposit(amount: number) { this.balance += amount; } getBalance() { return this.balance; } } const acc = new Account(); acc.deposit(1000); // OK acc.getBalance(); // OK acc.balance = 9999; // Помилка: властивість private

Приватні члени видно лише всередині самого класу. Навіть наслідники не мають до них доступу.


Сучасна альтернатива: #private (JS-level private)

З 2022 року підтримується справжня приватність у JS (ESNext):

javascript
class Account { #balance = 0; // приватно на рівні JS deposit(amount: number) { this.#balance += amount; } }

На відміну від private (TS-only), #balance дійсно недоступне навіть через Reflect/Proxy в runtime. TypeScript підтримує обидва варіанти.


3. protected - захищений доступ

protected означає, що властивість доступна:

  • всередині самого класу,
  • і в усіх наслідниках,
  • але не ззовні.
javascript
class Animal { protected move() { console.log("Moving..."); } } class Dog extends Animal { bark() { this.move(); // доступно в насліднику console.log("Woof!"); } } const d = new Dog(); d.bark(); // OK d.move(); // Помилка: protected

protected - це "трохи більш відкритий private", який доступний лише по ланцюжку успадкування.


4. readonly - лише для читання

readonly не обмежує область видимості, але забороняє зміну значення після ініціалізації (у конструкторі або прямо при оголошенні):

javascript
class Point { readonly x: number; readonly y: number; constructor(x: number, y: number) { this.x = x; this.y = y; } } const p = new Point(5, 10); p.x = 20; // Помилка: властивість лише для читання

Часто комбінується з public, private, protected:

javascript
class User { constructor(public readonly id: number, public name: string) {} }

5. Модифікатори в параметрах конструктора (скорочений запис)

TypeScript дозволяє оголошувати й ініціалізувати властивості прямо в параметрах конструктора:

javascript
class User { constructor( public name: string, private password: string, protected readonly role: string ) {} } const u = new User("Tim", "123", "admin"); u.name; // OK u.password; // Помилка: private u.role; // Помилка: protected

У JS це звичайний конструктор, але TS створює і типізує поля автоматично.


6. Комбінування модифікаторів

ПрикладЩо означає
public readonlyДоступно скрізь, але не можна змінювати
private readonlyЛише всередині класу і не можна змінювати
protected readonlyЛише в класі та наслідниках, не можна змінювати
javascript
class Config { protected readonly env = "prod"; private readonly secret = "123"; }

7. Модифікатори методів і аксесорів

Модифікатори можна ставити і перед методами / get / set:

javascript
class Example { private value = 0; protected get double() { return this.value * 2; } public setValue(v: number) { this.value = v; } }

ПІДСУМКОВА ТАБЛИЦЯ

МодифікаторВидимістьДоступ у наслідникахДоступ ззовніОсобливості
publicСкрізьТакТакЗа замовчуванням
privateЛише в класіНіНіTS-only, видаляється при компіляції
protectedУ класі та наслідникахТакНіВикористовується при наслідуванні
readonlyСкрізь (залежить від public/protected/private)ТакТак/НіЛише для читання
#private (ESNext)Лише в класіНіНіДійсно приватне в runtime

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.