Що робить модифікатор доступу private?
Модифікатор private у TypeScript використовується, щоб приховати властивість або метод класу - зробити його доступним лише всередині самого класу.
Це засіб інкапсуляції, який допомагає захистити внутрішні дані від зовнішнього втручання.
1. Синтаксис
class User {
private password: string;
constructor(password: string) {
this.password = password;
}
private encryptPassword(): string {
return this.password.split("").reverse().join("");
}
public checkPassword(pwd: string): boolean {
return this.encryptPassword() === pwd.split("").reverse().join("");
}
}
const u = new User("secret");
u.checkPassword("secret"); // можна
u.password; // Помилка - private
u.encryptPassword(); // Помилка - privateУсе, що позначено як private, доступне лише всередині самого класу
(ні ззовні, ні в нащадках використати не можна).
2. Правила видимості
| Де звертаємося | Чи можна отримати доступ до private? |
|---|---|
| Усередині класу | Так |
| У нащадку | Ні |
| Ззовні (через екземпляр) | Ні |
3. Приклад з успадкуванням
class Animal {
private type = "animal";
public showType() {
console.log(this.type);
}
}
class Dog extends Animal {
bark() {
// console.log(this.type); Помилка - private в Animal
}
}
const dog = new Dog();
dog.showType(); // працює через публічний метод
privateзахищає дані навіть від нащадків. Якщо потрібно, щоб було видно в успадкованих класах - потрібенprotected.
4. Private-поля в параметрах конструктора
class User {
constructor(private name: string, private age: number) {}
public getInfo() {
return `${this.name}, ${this.age}`;
}
}
const u = new User("Tim", 30);
u.getInfo(); // Tim, 30
u.name; // Помилка: privateTypeScript сам створює і типізує приватні поля, якщо вказати private прямо в параметрі конструктора.
5. Різниця між private (TS) і #private (JS)
TypeScript підтримує два види приватності:
| Вид | Рівень приватності | Перевіряється | Доступність у рантаймі |
|---|---|---|---|
private | Лише на рівні TypeScript | під час компіляції | Ні (видаляється в JS) |
#private | Справжнє поле JavaScript (ES2022) | рушієм JS | Так (реально приватне) |
Приклад:
class Account {
private balance = 100; // приватність лише на рівні TS
#id = 42; // приватність на рівні JS
getInfo() {
console.log(this.balance, this.#id);
}
}
const a = new Account();
a.balance; // Помилка типів (але доступно в рантаймі через a["balance"])
a.#id; // Помилка і на рівні типів, і на рівні JS - реально приховано#private працює навіть після компіляції -
це справжній захист у рантаймі, а не лише в TS.
6. Поєднання private + readonly
Іноді поля роблять приватними і лише для читання:
class Config {
private readonly secret = "key123";
}Не можна змінити значення навіть усередині класу після ініціалізації.
Підсумок
| Характеристика | Опис |
|---|---|
| Доступність | Лише всередині класу |
| Доступ з нащадків | Ні |
| Доступ ззовні | Ні |
| Рівень захисту | Перевіряється TypeScript під час компіляції |
| Альтернатива | #private - справжнє приватне поле в JS |
| Часте застосування | Для приховування логіки, паролів, токенів, внутрішніх даних |
Коротко:
privateзахищає внутрішні дані класу від зовнішнього коду і робить їх доступними лише всередині самого класу.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.