Почему в примере дублируются строки инициализации полей класса?

В TypeScript при объявлении полей класса вы можете использовать два способа инициализации: в конструкторе или при объявлении поля. Иногда может возникнуть вопрос, почему в примере дублируются строки инициализации полей класса.

Вот пример класса, когда строки инициализации полей дублируются:

class MyClass {
    private name: string;
    private age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
}

В этом примере, по сути, мы делаем две операции:

1. Объявляем поля класса name и age. Они не инициализированы, а только объявлены.
2. В конструкторе мы присваиваем значения этим полям.

Но почему мы делаем такую дублированную инициализацию?

Причина кроется в том, что TypeScript не позволяет объявить поля класса без явной инициализации или присвоения значения. Он требует, чтобы переменные класса были инициализированы перед использованием.

Если мы попробуем объявить поля класса без явной инициализации или присвоения значения, мы получим ошибку компиляции:

class MyClass {
    private name: string; // Ошибка компиляции: Переменная name должна быть инициализирована
    private age: number; // Ошибка компиляции: Переменная age должна быть инициализирована
}

Поэтому мы вынуждены инициализировать поля в самом начале объявления класса, чтобы удовлетворить требования TypeScript. Затем, в конструкторе, мы просто присваиваем им значения.

Важно отметить, что если выполнить первую часть инициализации в объявлении поля, а вторую часть - в конструкторе, то TypeScript откажется компилировать код, так как все поля должны быть инициализированы перед их первым использованием:

class MyClass {
    private name: string = ''; // Ошибка компиляции: Переменная name должна быть инициализирована
    private age: number = 0; // Ошибка компиляции: Переменная age должна быть инициализирована

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
}

Поэтому, чтобы избежать ошибок компиляции, мы объявляем поля без инициализации и инициализируем их в конструкторе.