Модифікатори доступу
TypeScript підтримує кілька модифікаторів доступу (access modifiers), які дозволяють керувати видимістю властивостей і методів у класах. Вони потрібні для інкапсуляції - щоб обмежити доступ до внутрішніх даних об'єкта.
Основні модифікатори доступу
| Модифікатор | Де видно | Ключове слово |
|---|---|---|
| public | Скрізь (за замовчуванням) | public |
| private | Лише всередині того самого класу | private |
| protected | Усередині класу та його наслідників | protected |
| readonly | Лише для читання, не можна змінити після ініціалізації | readonly (не зовсім про доступ, але часто використовується разом) |
1. public - публічний доступ (за замовчуванням)
Усі члени класу за замовчуванням public,
навіть якщо модифікатор не вказано.
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 робить властивість або метод недоступними за межами класу,
навіть для наслідників.
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):
class Account {
#balance = 0; // приватно на рівні JS
deposit(amount: number) {
this.#balance += amount;
}
}На відміну від private (TS-only),
#balance дійсно недоступне навіть через Reflect/Proxy в runtime.
TypeScript підтримує обидва варіанти.
3. protected - захищений доступ
protected означає, що властивість доступна:
- всередині самого класу,
- і в усіх наслідниках,
- але не ззовні.
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 не обмежує область видимості,
але забороняє зміну значення після ініціалізації (у конструкторі або прямо при оголошенні):
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:
class User {
constructor(public readonly id: number, public name: string) {}
}5. Модифікатори в параметрах конструктора (скорочений запис)
TypeScript дозволяє оголошувати й ініціалізувати властивості прямо в параметрах конструктора:
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 | Лише в класі та наслідниках, не можна змінювати |
class Config {
protected readonly env = "prod";
private readonly secret = "123";
}7. Модифікатори методів і аксесорів
Модифікатори можна ставити і перед методами / get / set:
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 |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.