Параметры-свойства в конструкторе
Сокращение, которое убирает шаблонный код при создании полей класса.
Параметры-свойства — синтаксис TypeScript, когда модификатор доступа в параметре конструктора автоматически создаёт и инициализирует поле класса.
Многословный способ
Чтобы передать данные в объект, обычно пишут одно и то же трижды: объявляют поле, объявляют параметр, присваивают. Это утомительный шаблон:
class Point {
x: number; // 1) объявили поле
y: number;
constructor(x: number, y: number) { // 2) объявили параметр
this.x = x; // 3) присвоили
this.y = y;
}
}
Для класса с пятью полями это пятнадцать строк почти одинакового кода. TypeScript предлагает короче.
Параметры-свойства
Если добавить модификатор доступа (public, private, protected или readonly) прямо к параметру конструктора, TypeScript сам создаст одноимённое поле и присвоит ему значение:
class Point {
constructor(
public x: number,
public y: number,
) {}
}
const p = new Point(3, 4);
console.log(p.x, p.y); // 3 4
Этот класс полностью эквивалентен предыдущему, но втрое короче. Объявление, параметр и присваивание слились в одну строку на каждое поле.
Сравнение
| Обычный способ | Параметры-свойства |
поле + параметр + this.x = x | public x: number в конструкторе |
| 3 упоминания имени | 1 упоминание |
Работает с любыми модификаторами
Можно смешивать уровни доступа и readonly — каждый параметр становится полем с заданными свойствами:
class User {
constructor(
public readonly id: number, // публичное, неизменяемое
public name: string, // публичное, изменяемое
private password: string, // приватное
) {}
checkPassword(input: string): boolean {
return this.password === input;
}
}
const u = new User(1, "Аня", "secret");
console.log(u.id, u.name); // 1 Аня
u.password; // Ошибка: Property 'password' is private.
Важная деталь
Поле создаётся только если у параметра есть модификатор. Обычный параметр без public/private/readonly остаётся просто аргументом и полем не становится:
class Bad {
constructor(value: number) {} // value — НЕ поле, просто параметр
}
const b = new Bad(5);
console.log(b.value); // Ошибка: Property 'value' does not exist.
Эта возможность убирает большую часть рутины в классах-моделях и делает их компактными и читаемыми — что особенно ценят во фреймворках с внедрением зависимостей вроде Angular и NestJS.
Итог
- Модификатор у параметра конструктора автоматически создаёт и инициализирует одноимённое поле.
- Это убирает шаблон «объявил поле — объявил параметр — присвоил».
- Без модификатора параметр полем не становится — остаётся обычным аргументом.