Модификаторы доступа позволяют сокрыть состояние объекта от внешнего доступа и управлять доступом к этому состоянию. В TypeScript три модификатора: public, protected и private.
Если к свойствам и функциям классов не применяется модификатор, то такие свойства и функции расцениваются как будто они определены с модификатором
public. То есть следующее определение класса:
class Person {
name: string;
year: number;
}
Будет эквивалентно:
class Person {
public name: string;
public year: number;
}
Если же к свойствам и методам применяется модификатор private, то к ним нельзя будет обратиться извне при создании объекта данного класса.
Например, создадим класс с приватными свойствами и методами:
class Person {
private _name: string;
private _year: number;
constructor(name: string, age: number) {
this._name = name;
this._year = this.setYear(age);
}
public print(): void {
console.log(`Имя: ${this._name} Год рождения: ${this._year}`);
}
private setYear(age: number): number {
return new Date().getFullYear() - age;
}
}
let tom = new Person("Tom", 24);
tom.print();
// console.log(tom._name); // нельзя обратиться, так как _name - private
// tom.setYear(45); // нельзя обратиться, так как функция - private
Два свойства _name и _year используются с модификатором private, поэтому мы не можем их использовать вне класса,
например, console.log(tom._name). То же самое относится к функции setYear(). Остальные функции доступны.
Модификатор protected определяет поля и методы, которые из вне класса видны только в классах-наследниках:
class Person {
protected name: string;
private year: number;
constructor(name: string, age: number) {
this.name = name;
this.year = this.setYear(age);
}
protected printPerson(): void {
console.log(`Имя: ${this.name} Год рождения: ${this.year}`);
}
private setYear(age: number): number {
return new Date().getFullYear() - age;
}
}
class Employee extends Person {
protected company: string;
constructor(name: string, age: number, company: string) {
super(name, age);
this.company = company;
}
public printEmployee(): void {
//console.log("Year: " + this.year); // поле year недоступно, так как private
// setYear(25); // метод setYear недоступен, так как private
this.printPerson(); // метод printPerson доступен, так как protected
console.log(`Компания: ${this.company}`);
}
}
let sam = new Employee("Sam", 31, "Microsoft");
sam.printEmployee();
В классе Employee будет доступно поле name, а также метод printPerson(), так как они имеют модификатор protected.
А вот приватное свойство year и приватный метод setYear() будут недоступны.
Использование модификаторов в параметрах конструктора позволяет сократить написание кода. Например, пусть у нас есть следующий класс:
class Person {
private name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
printPerson(): void {
console.log(`Имя: ${this.name} Возраст: ${this.age}`);
}
}
Этот класс будет аналогичен следующему:
class Person {
constructor(private name: string, private age: number) { }
printPerson(): void {
console.log(`Имя: ${this.name} Возраст: ${this.age}`);
}
}
Используя модификаторы в параметрах конструктора, нам больше не надо явно создать свойства для этих параметров. Свойства создаются автоматически, называются они по имени параметров и имеют те же модификаторы, что и параметры.
Подобным образом, если мы хотим сделать свойства публичными, то следует использовать модификатор public:
class Person {
constructor(public name: string, public age: number) { }
printPerson(): void {
console.log(`Имя: ${this.name} Возраст: ${this.age}`);
}
}
Если необходимо сделать поле для чтения, то к модификатору доступа добавляется модификатор readonly:
class Person {
constructor(private readonly name: string, private age: number) { }
}