Параметры-свойства в конструкторе

Сокращение, которое убирает шаблонный код при создании полей класса.

Параметры-свойства — синтаксис 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 = xpublic 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.

Итог

  • Модификатор у параметра конструктора автоматически создаёт и инициализирует одноимённое поле.
  • Это убирает шаблон «объявил поле — объявил параметр — присвоил».
  • Без модификатора параметр полем не становится — остаётся обычным аргументом.
Проверьте себя
1. Что делает запись constructor(public x: number) {}?
AОбъявляет локальную переменную x внутри конструктора
BАвтоматически создаёт поле x класса и присваивает ему значение аргумента
CДелает поле x приватным
DСоздаёт статический метод x
2. Станет ли полем класса параметр конструктора без модификатора доступа?
AДа, любой параметр становится полем
BНет, без модификатора это просто аргумент, а не поле
CДа, но только если включён strict
DТолько если параметр имеет тип number
3. Какую проблему решают параметры-свойства?
AУскоряют создание объектов
BУбирают шаблонный код «объявить поле — объявить параметр — присвоить»
CШифруют поля класса
DПозволяют классу не иметь конструктора
Поддержать проект