TypeScript реализует объектно-ориентированный подход, в нем есть полноценная поддержка классов. Класс представляет шаблон для создания объектов и инкапсулирует функциональность, которую должен иметь объект. Класс определяет состояние и поведение, которыми обладает объект.
Для определения нового класса применяется ключевое слово class
. Например, определим класс User:
class User {}
После определения класса мы можем создавать его объекты:
let tom: User = new User(); let alice = new User();
Здесь определено два объекта класса User - tom и alice.
Для хранения состояния объекта в классе определяются поля:
class User { name: string; age: number; }
Здесь определены два поля - name
и age
, которые имеют типы string
и number
соответственно.
Фактически поля представляют переменные уровня класса, только для их объявления не применяются var
и let
.
По имени объекта мы можем обращаться к этим полям:
class User { name: string; age: number; } let tom = new User(); tom.name = "Tom"; tom.age = 36; console.log(`name: ${tom.name} age: ${tom.age}`); // name: Tom age: 36
При определении полей им можно задать некоторые начальные значения:
class User { name: string = "Tom Smith"; age: number = 18; } let user = new User(); console.log(`name: ${user.name} age: ${user.age}`); // name: Tom Smith age: 18
Классы также могут определять поведение - некоторые действия, которые должны выполнять объекты этого класса. Для этого внутри класса определяются функции, которые называются методами.
class User { name: string; age: number; print(){ console.log(`name: ${this.name} age: ${this.age}`); } toString(): string{ return `${this.name}: ${this.age}`; } }
Здесь в классе User определены два метода. Метод print()
выводит информацию об объекте на консоль, а метод toString()
возвращает
некоторое представление объекта в виде строки.
В отличие от обычных функций для определения методов не указывается ключевое слово function
.
Для обращения внутри методов к полям и другим методам класса применяется ключевое слово this, которое указывает на текущий объект этого класса.
Применение методов:
class User { name: string; age: number; print(){ console.log(`name: ${this.name} age: ${this.age}`); } toString(): string{ return `${this.name}: ${this.age}`; } } let tom = new User(); tom.name = "Tom"; tom.age = 36; tom.print(); // name: Tom age: 36 console.log(tom.toString()); // Tom: 36
Кроме обычных методов классы имеют специальные функции - конструкторы, которые определяются с помощью ключевого слова constructor. Конструкторы выполняют начальную инициализацию объекта. Например, добавим в класс User конструктор:
class User { name: string; age: number; constructor(userName: string, userAge: number) { this.name = userName; this.age = userAge; } print(){ console.log(`name: ${this.name} age: ${this.age}`); } } let tom = new User("Tom", 36); tom.print(); // name: Tom age: 36
Здесь конструктор применимает два параметра и использует их значения для установки значения полей name и age:
constructor(userName: string, userAge: number) { this.name = userName; this.age = userAge; }
Затем при создании объекта в конструктор передается два значения для его параметров:
let tom = new User("Tom", 36);
Полям класса в процессе работы программы можно присваивать различные значения, которые соответствуют типу полей. Однако TypeScript также позволяет определять поля для чтения, значения которых нельзя изменить (кроме как в конструкторе). Для определения таких полей применяется ключевое слово readonly:
class User { readonly name: string = "Default user"; age: number; constructor(userName: string, userAge: number) { this.name = userName; this.age = userAge; } print(){ console.log(`name: ${this.name} age: ${this.age}`); } }
Значение полей для чтения можно установить либо при объявлении:
readonly name: string = "Default user";
Либо в конструкторе:
constructor(userName: string, userAge: number) { this.name = userName; this.age = userAge; }
В остальных местах программы значение этого поля нельзя изменить. Например, в следующем случае мы получим при компиляции ошибку, потому что пытаемся установить поле для чтения:
class User { readonly name: string = "Default user"; age: number; constructor(userName: string, userAge: number) { this.name = userName; this.age = userAge; } print(){ console.log(`name: ${this.name} age: ${this.age}`); } } let tom = new User("Tom", 36); tom.name = "Bob"; // ! Ошибка - поле name - только для чтения tom.print(); // name: Tom age: 36