TypeScript не поддерживает несколько объявлений тела конструктора в одном классе, как это возможно во многих ООП-языках. Вместо этого можно объявить несколько сигнатур конструктора (overloads), а затем реализовать единое тело конструктора, где вручную делается разбор аргументов:
class User { name: string; age: number; constructor(name: string); constructor(name: string, age: number); constructor(name: string, age?: number) { this.name = name; this.age = age ?? 18; } } const u1 = new User('Alice'); // age = 18 const u2 = new User('Bob', 32); // age = 32
Важные детали:
«Можно ли реализовать конструктор вот так?»
undefined
class Test { constructor(x: number) {} constructor(x: string) {} }
**Правильный ответ:** Нет, такой код вызовет ошибку: "Duplicate constructor implementation". В TypeScript допускается только одна реализация тела конструктора, перегрузки оформляются в виде сигнатур (без тела).
### Примеры реальных ошибок из-за незнания тонкостей темы.
---
> История
В проекте пытались реализовать класс с двумя конструкторами с разными параметрами — скопировав опыт с Java. В результате TypeScript выбрасывает ошибку компиляции, проект не собирается, пришлось срочно переделывать под перегрузки в сигнатурах.
---
> История
Один из членов команды написал конструктор класса с перегрузкой, но забыл учесть необязательность параметров (не обрабатывал undefined). Это приводило к попыткам обратиться к несуществующим значениям и к сбоям при создании экземпляров с минимальным набором аргументов.
---
> История
Были объявлены перегрузки конструктора, но тело конструктора не совпадало с описанными вариантами вызова. В одном случае ожидался обязательно второй аргумент, а в сигнатуре он был опциональным. Такой конфликт не выявили сразу, но он всплыл при написании unit-тестов и затруднил отладку.