TypeScript nie wspiera wielu deklaracji ciała konstruktora w jednej klasie, jak to jest możliwe w wielu językach OOP. Zamiast tego, można zadeklarować kilka sygnatur konstruktora (overloads), a następnie zrealizować jedno ciało konstruktora, gdzie ręcznie rozdrabnia się argumenty:
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
Ważne szczegóły:
„Czy można zaimplementować konstruktor w ten sposób?”
undefined
class Test { constructor(x: number) {} constructor(x: string) {} }
**Poprawna odpowiedź:** Nie, ten kod spowoduje błąd: "Duplicate constructor implementation". W TypeScript dozwolona jest tylko jedna realizacja ciała konstruktora, przeciążenia są przedstawiane w postaci sygnatur (bez ciała).
### Przykłady rzeczywistych błędów z powodu braku znajomości szczegółów tematu.
---
> Historia
W projekcie próbowano zaimplementować klasę z dwoma konstruktorami o różnych parametrach — kopiując doświadczenie z Javy. W rezultacie TypeScript zgłosił błąd kompilacji, projekt nie zbudował się, trzeba było pilnie przerobić na przeciążenia w sygnaturach.
---
> Historia
Jeden z członków zespołu napisał konstruktor klasy z przeciążeniem, ale zapomniał uwzględnić opcjonalność parametrów (nie obsługiwał undefined). To prowadziło do prób uzyskania dostępu do nieistniejących wartości i awarii podczas tworzenia instancji z minimalnym zestawem argumentów.
---
> Historia
Zadeklarowano przeciżenia konstruktora, ale ciało konstruktora nie zgadzało się z opisanymi wariantami wywołania. W jednym przypadku oczekiwano obowiązkowego drugiego argumentu, a w sygnaturze był on opcjonalny. Taki konflikt nie został wykryty od razu, ale ujawnił się podczas pisania testów jednostkowych i utrudnił debugowanie.