programowanieProgramista Fullstack

Jak zaimplementować i typować przeciążone konstruktory klas w TypeScript? Dlaczego nie można po prostu zadeklarować kilku metod constructor i jak to poprawnie osiągnąć?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

  • W klasie można podać kilka sygnatur przed realizacją, ale tylko JEDNA realizacja konstruktora jest dozwolona.
  • Realizacja konstruktora musi być zgodna ze wszystkimi wariantami przeciążenia.
  • TypeScript samodzielnie sprawdza zgodność argumentów z przeciążeniami.

Pytanie podchwytliwe.

„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.