Как типизируются классы и их свойства?
В TypeScript классы являются не только объектами, но и типами, что позволяет описывать их структуру и поведение максимально строго. Типизация классов помогает контролировать корректность кода на этапе компиляции, задавать ограничения для свойств и методов, а также строить более надёжные и предсказуемые архитектуры.
Типизация свойств класса
Свойства класса типизируются аналогично переменным. Указывая тип прямо при объявлении, мы обеспечиваем, что объект класса всегда будет содержать данные ожидаемого формата.
class User {
name: string;
age: number;
isActive: boolean;
constructor(name: string, age: number, isActive: boolean) {
this.name = name;
this.age = age;
this.isActive = isActive;
}
}
Здесь name всегда строка, age — число, а isActive — булево значение.
Модификаторы доступа и их влияние на типизацию
TypeScript поддерживает модификаторы public, private, protected и readonly. Они влияют не на тип, а на доступность свойств и методов, однако часто применяются вместе с типизацией для более чёткой декларации.
-
public — доступен везде (по умолчанию);
-
private — доступен только внутри класса;
-
protected — доступен внутри класса и наследников;
-
readonly — свойство может быть установлено только при инициализации или в конструкторе.
class Account {
readonly id: number;
private balance: number;
protected owner: string;
constructor(id: number, balance: number, owner: string) {
this.id = id;
this.balance = balance;
this.owner = owner;
}
}
Таким образом можно задать строгие правила для работы с данными.
Типизация методов класса
Методы классов описываются аналогично функциям: указываются типы аргументов и возвращаемого значения.
class Calculator {
add(a: number, b: number): number {
return a + b;
}
log(message: string): void {
console.log(message);
}
}
Здесь add всегда возвращает число, а log не возвращает значение (void).
Типизация через параметры конструктора
TypeScript поддерживает сокращённую запись свойств через параметры конструктора. В этом случае модификатор (public, private, protected, readonly) автоматически создаёт и типизирует свойство.
class Product {
constructor(
public name: string,
private price: number,
readonly id: string
) {}
}
Здесь name, price и id автоматически становятся свойствами класса с соответствующими типами.
Наследование и обобщённые типы
Классы можно типизировать через generics, чтобы описывать универсальное поведение.
class Repository<T> {
private items: T\[\] = \[\];
add(item: T): void {
this.items.push(item);
}
getAll(): T\[\] {
return this.items;
}
}
const stringRepo = new Repository<string>();
stringRepo.add("hello");
const numberRepo = new Repository<number>();
numberRepo.add(42);
Благодаря обобщённым типам один класс может работать с разными типами данных, сохраняя строгую типизацию.
Интерфейсы и классы
Класс может реализовывать интерфейс, что гарантирует наличие определённых свойств и методов.
interface IShape {
area(): number;
}
class Rectangle implements IShape {
constructor(public width: number, public height: number) {}
area(): number {
return this.width \* this.height;
}
}
Таким образом, классы можно использовать в качестве строгих контрактов, задающих правила для архитектуры приложения.