логотип PurpleSchool
Иконка входа
Вход
логотип PurpleSchool

Модификаторы доступа в TypeScript

Автор

Дмитрий Нечаев

Модификаторы доступа в TypeScript позволяют управлять доступом к свойствам и методам классов. Они помогают инкапсулировать данные, защищать внутреннее состояние объектов и управлять видимостью компонентов. В TypeScript доступны три модификатора доступа: public, protected и private.

Модификатор public

Модификатор public является модификатором по умолчанию. Свойства и методы, помеченные как public, доступны из любого места, как внутри класса, так и вне его.

Пример использования public

class Person {
    public name: string;

    constructor(name: string) {
        this.name = name;
    }

    public greet(): void {
        console.log(`Hello, my name is ${this.name}.`);
    }
}

let person = new Person("Alice");
console.log(person.name); // "Alice"
person.greet(); // "Hello, my name is Alice."

В этом примере свойство name и метод greet доступны как внутри, так и вне класса Person.

Модификатор protected

Свойства и методы, помеченные как protected, доступны только внутри класса и его наследников. Это позволяет защищать внутреннее состояние объекта от прямого доступа извне, но позволяет наследникам использовать и изменять эти свойства и методы.

Пример использования protected

class Animal {
    protected name: string;

    constructor(name: string) {
        this.name = name;
    }

    protected makeSound(): void {
        console.log(`${this.name} makes a sound.`);
    }
}

class Dog extends Animal {
    constructor(name: string) {
        super(name);
    }

    public bark(): void {
        console.log(`${this.name} barks.`);
        this.makeSound(); // Вызов защищенного метода родительского класса
    }
}

let dog = new Dog("Rex");
dog.bark(); // "Rex barks." затем "Rex makes a sound."
// console.log(dog.name); // Ошибка: свойство 'name' защищено
// dog.makeSound(); // Ошибка: метод 'makeSound' защищен

В этом примере свойство name и метод makeSound доступны внутри класса Animal и его наследника Dog, но недоступны извне.

Модификатор private

Свойства и методы, помеченные как private, доступны только внутри самого класса, в котором они объявлены. Они недоступны ни в классе-наследнике, ни извне.

Пример использования private

class BankAccount {
    private balance: number;

    constructor(initialBalance: number) {
        this.balance = initialBalance;
    }

    public deposit(amount: number): void {
        if (amount > 0) {
            this.balance += amount;
            console.log(`Deposited: ${amount}. New balance: ${this.balance}`);
        }
    }

    public getBalance(): number {
        return this.balance;
    }
}

let account = new BankAccount(100);
account.deposit(50); // "Deposited: 50. New balance: 150"
console.log(account.getBalance()); // 150
// console.log(account.balance); // Ошибка: свойство 'balance' приватно

В этом примере свойство balance доступно только внутри класса BankAccount и недоступно извне, что защищает внутреннее состояние счета от прямого изменения.

Примеры использования модификаторов доступа

Пример с комбинацией модификаторов

class Vehicle {
    public make: string;
    protected model: string;
    private year: number;

    constructor(make: string, model: string, year: number) {
        this.make = make;
        this.model = model;
        this.year = year;
    }

    public getDetails(): void {
        console.log(`Make: ${this.make}, Model: ${this.model}, Year: ${this.year}`);
    }
}

class Car extends Vehicle {
    private mileage: number;

    constructor(make: string, model: string, year: number, mileage: number) {
        super(make, model, year);
        this.mileage = mileage;
    }

    public getCarDetails(): void {
        console.log(`Make: ${this.make}, Model: ${this.model}, Mileage: ${this.mileage}`);
        // console.log(`Year: ${this.year}`); // Ошибка: свойство 'year' приватно
    }
}

let car = new Car("Toyota", "Camry", 2020, 5000);
car.getDetails(); // "Make: Toyota, Model: Camry, Year: 2020"
car.getCarDetails(); // "Make: Toyota, Model: Camry, Mileage: 5000"

В этом примере класс Vehicle содержит свойства с разными модификаторами доступа. Класс Car наследует Vehicle и демонстрирует доступ к защищенным и публичным свойствам, но не к приватным.

Использование методов-модификаторов

Для управления доступом к приватным и защищенным свойствам и методам можно использовать публичные методы, которые обеспечивают безопасное взаимодействие с внутренними данными.

Пример использования методов-модификаторов

class Employee {
    private salary: number;

    constructor(salary: number) {
        this.salary = salary;
    }

    public getSalary(): number {
        return this.salary;
    }

    public setSalary(newSalary: number): void {
        if (newSalary > 0) {
            this.salary = newSalary;
        } else {
            console.log("Invalid salary.");
        }
    }
}

let employee = new Employee(50000);
console.log(employee.getSalary()); // 50000
employee.setSalary(55000);
console.log(employee.getSalary()); // 55000
employee.setSalary(-1000); // "Invalid salary."
console.log(employee.getSalary()); // 55000

В этом примере класс Employee использует публичные методы getSalary и setSalary для доступа и изменения приватного свойства salary.

Заключение

Модификаторы доступа в TypeScript предоставляют мощный механизм для управления видимостью и доступом к свойствам и методам классов. Они помогают инкапсулировать данные и защищать внутреннее состояние объектов, обеспечивая более безопасное и управляемое взаимодействие с ними. Правильное использование модификаторов public, protected и private способствует созданию надежного и легко поддерживаемого кода.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile