Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить модифікатор доступу private?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`private`** робить властивість чи метод класу доступними лише всередині самого класу - ні ззовні, ні в успадкованих класах. **Ключове:** це перевіряється лише TypeScript при компіляції і зникає в JS, тож для справжньої приватності в рантаймі використовують `#private`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняМодифікатор `private` у TypeScript використовується, щоб **приховати** властивість або метод класу - зробити його **доступним лише всередині самого класу**. Це засіб **інкапсуляції**, який допомагає захистити внутрішні дані від зовнішнього втручання. --- ## 1. Синтаксис ```javascript 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. Приклад з успадкуванням ```javascript 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-поля в параметрах конструктора ```javascript 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; // Помилка: private ``` TypeScript сам створює і типізує приватні поля, якщо вказати `private` прямо в параметрі конструктора. --- ## 5. Різниця між `private` (TS) і `#private` (JS) TypeScript підтримує **два види приватності**: | Вид | Рівень приватності | Перевіряється | Доступність у рантаймі | |---|---|---|---| | `private` | Лише на рівні **TypeScript** | під час компіляції | Ні (видаляється в JS) | | `#private` | Справжнє поле JavaScript (ES2022) | рушієм JS | Так (реально приватне) | ### Приклад: ```javascript 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` Іноді поля роблять **приватними і лише для читання**: ```javascript class Config { private readonly secret = "key123"; } ``` > Не можна змінити значення навіть усередині класу після ініціалізації. --- ## Підсумок | Характеристика | Опис | |---|---| | Доступність | Лише всередині класу | | Доступ з нащадків | Ні | | Доступ ззовні | Ні | | Рівень захисту | Перевіряється TypeScript під час компіляції | | Альтернатива | `#private` - справжнє приватне поле в JS | | Часте застосування | Для приховування логіки, паролів, токенів, внутрішніх даних | --- Коротко: > `private` захищає внутрішні дані класу від зовнішнього коду > і робить їх доступними **лише всередині самого класу**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.