В объектно-ориентированном программировании важную роль играет инкапсуляция — сокрытие внутреннего состояния объекта. В TypeScript для этого используется модификатор доступа private.
Если свойство или метод помечены как private, они доступны только внутри самого класса. Попытка обратиться к ним снаружи (через экземпляр класса или в наследниках) приведет к ошибке компиляции. Это позволяет защитить данные от некорректного изменения извне.
В этом уроке вы научитесь объявлять приватные поля, отличать их от публичных и правильно организовывать доступ к данным внутри классов.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Поиск приватных свойств
В приведённом коде класса Wallet найдите и отметьте все свойства, помеченные модификатором private. Для каждого выделенного фрагмента укажите, является ли свойство приватным (private) или публичным (public).
class Wallet {
{{private balance~|~t1}}: number;
{{public owner~|~t2}}: string;
{{private id~|~t3}}: number;
{{public currency~|~t4}}: string;
}2. Выбор модификатора
В данном фрагменте кода TypeScript представлен класс 'ServerConfig', который содержит конфигурационные данные сервера. В коде пропущены модификаторы доступа перед полями 'secretKey' и 'port'. Вам необходимо выбрать подходящие модификаторы из выпадающего списка для каждого пропуска, чтобы правильно определить уровень доступа к полям класса. Обратите внимание, что секретный ключ должен быть скрыт от внешнего доступа, а порт — доступен для чтения извне.
class ServerConfig {
input1S secretKey: string = 'my-secret-key';
input2S port: number = 8080;
getSecretKey(): string {
return this.secretKey;
}
getPort(): number {
return this.port;
}
}3. Синтаксис private
В этом задании вам нужно дополнить фрагмент кода на TypeScript, сделав свойство класса приватным. В классе BankAccount есть свойство balance, которое сейчас публично доступно извне. Чтобы ограничить прямой доступ к этому свойству и обеспечить инкапсуляцию, необходимо добавить соответствующий модификатор доступа. Впишите нужное ключевое слово в отмеченное место, чтобы код соответствовал принципам инкапсуляции и компилировался без ошибок.
class BankAccount {
input1S balance: number;
constructor(initialBalance: number) {
this.balance = initialBalance;
}
public getBalance(): number {
return this.balance;
}
}4. Области видимости
Перед вами фрагменты кода TypeScript, связанные с использованием модификаторов доступа в классах. Распределите их по двум категориям: 'Доступно везде' (public) и 'Доступно только в классе' (private). Public члены класса видны из любого места в коде, включая внешние вызовы, тогда как private члены защищены и доступны исключительно внутри методов того же класса. Это упражнение поможет закрепить понимание областей видимости в TypeScript и правильно применять модификаторы.
public name: string;private secret: number;this.name = 'John';this.secret = 123;let obj = new MyClass(); obj.name;let obj = new MyClass(); obj.secret;public greet() { console.log('Hello'); }5. Исправление доступа
В данном фрагменте кода TypeScript допущена ошибка, связанная с нарушением инкапсуляции. Внешний код пытается напрямую изменить приватное свойство класса. Найдите строку с некорректным доступом и исправьте её, используя предусмотренный классом публичный интерфейс для изменения состояния объекта.
class Task { private _status: string = 'pending'; public getStatus(): string { return this._status; } public setStatus(newStatus: string): void { this._status = newStatus; }} const myTask = new Task();myTask._status = 'completed'; // Ошибка: прямое изменение приватного поля6. Сборка класса с инкапсуляцией
Из предложенных строк соберите корректный класс `User` на TypeScript, реализующий инкапсуляцию с помощью модификатора `private`. Класс должен содержать приватное свойство для хранения пароля, конструктор для его инициализации и публичный метод для проверки соответствия переданного пароля. При сборке придерживайтесь общепринятого порядка: объявление класса, приватное свойство, конструктор, а затем метод. Некоторые строки лишние и не должны входить в решение.
class User { private password: string; constructor(password: string) { this.password = password; } public checkPassword(inputPassword: string): boolean { return this.password === inputPassword; }} public name: string; public changePassword(newPassword: string) { this.password = newPassword; }