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