Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Модифікатори доступу». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)TypeScript підтримує кілька **модифікаторів доступу (access modifiers)**, які дозволяють керувати **видимістю властивостей і методів** у класах: `public` (скрізь, за замовчуванням), `private` (лише в класі), `protected` (у класі та наслідниках) і `readonly` (лише для читання). **Ключове:** вони потрібні для **інкапсуляції** - щоб обмежити доступ до внутрішніх даних об'єкта.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення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 |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.