Модификаторы доступа позволяют сокрыть состояние объекта от внешнего доступа и управлять доступом к этому состоянию. В 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) { } }