ProgrammatieFullstack ontwikkelaar

Hoe overloaded constructors van klassen in TypeScript te implementeren en te typeren? Waarom is het niet mogelijk om gewoon meerdere constructor-methoden aan te geven, en hoe kan dit correct worden bereikt?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

TypeScript ondersteunt geen meerdere verklaringen van het lichaam van de constructeur in één klasse, zoals mogelijk is in veel OOP-talen. In plaats daarvan kun je meerdere constructor-signaturen (overloads) definiëren en vervolgens een enkel lichaam van de constructeur implementeren, waar je handmatig de argumenten ontleedt:

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

Belangrijke details:

  • In de klasse kun je meerdere signaturen boven de implementatie opgeven, maar er is slechts ÉÉN implementatie van de constructeur toegestaan.
  • De implementatie van de constructeur moet compatibel zijn met alle overloads.
  • TypeScript controleert zelf of de argumenten voldoen aan de overloads.

Vraag met een valstrik.

"Is het mogelijk om de constructeur zo te implementeren?"

undefined

class Test { constructor(x: number) {} constructor(x: string) {} }


**Correcte antwoord:** Nee, deze code zal een fout oproepen: "Duplicate constructor implementation". In TypeScript is slechts één implementatie van het lichaam van de constructeur toegestaan, overloads worden weergegeven in de vorm van signaturen (zonder lichaam).

### Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.

---
> Verhaal

In het project probeerden ze een klasse met twee constructeurs met verschillende parameters te implementeren - door ervaring uit Java te kopiëren. Als gevolg daarvan gooit TypeScript een compilatiefout, het project compileert niet, en ze moesten snel overschakelen naar overloads in signaturen.

---
> Verhaal

Een van de teamleden schreef de constructeur van de klasse met overload, maar vergat om de optionele parameters te overwegen (hij verwerkte undefined niet). Dit leidde tot pogingen om naar niet-bestaande waarden te verwijzen en tot crashes bij het maken van instanties met de minimale set argumenten.

---
> Verhaal

Overloads van de constructeur waren gedeclareerd, maar het lichaam van de constructeur kwam niet overeen met de beschreven aanroepvarianten. In één geval was de tweede argument verplicht, terwijl deze in de signatuur optioneel was. Dit conflict werd niet onmiddellijk opgemerkt, maar kwam aan het licht tijdens het schrijven van eenheidstests en bemoeilijkte de debugging.