Geschiedenis van de vraag:
TypeScript ondersteunt methodenoverbelasting, vergelijkbaar met andere strikt getypeerde talen (zoals Java of C#), maar de syntaxis voor overbelasting in TypeScript verschilt conceptueel. Hier zijn meerdere handtekeningen toegestaan, maar slechts één implementatie. Dit kan verwarring opleveren voor ontwikkelaars die bekend zijn met klassieke overbelasting.
Probleem:
Een veelvoorkomende fout is proberen meerdere methoden te definiëren met verschillende parameterverzamelingen. Dit leidt tot een compilatiefout, aangezien TypeScript één implementatie vereist die alle varianten van handtekeningen behandelt.
Oplossing:
Overbelasting wordt bereikt door meerdere handtekeningen van de methode te declareren en vervolgens een implementatie te geven die aan alle varianten voldoet. Voor de juiste differentiatie van parameters wordt meestal gebruik gemaakt van type guards of instanceof.
Voorbeeldcode:
class MyLogger { log(message: string): void; log(message: string, level: 'info' | 'error'): void; log(message: string, level?: 'info' | 'error'): void { const lvl = level ?? 'info'; console.log(`[${lvl}] ${message}`); } }
Belangrijke kenmerken:
Is het mogelijk om twee implementaties van dezelfde methode met verschillende parameterverzamelingen te realiseren?
Nee. In TypeScript is slechts één implementatie toegestaan. Meerdere methoden met dezelfde naam zijn een syntaxisfout.
Hoe rest-parameters te typiseren bij methodenoverbelasting om strikte typecontrole niet te verliezen?
Het wordt aanbevolen om in de handtekeningen de exacte parameters te beschrijven, en in de implementatie de meest algemene:
class Test { doWork(a: number): void; doWork(a: string): void; doWork(a: number | string): void { //... } }
Wat gebeurt er als de geretourneerde typen van overbelaste handtekeningen verschillend zijn?
TypeScript vereist dat de implementatie een samengestelde type (Union) retourneert. Anders is er een compilatiefout.
class X { get(value: number): string; get(value: string): number; get(value: number | string): string | number { return typeof value === 'number' ? 'number' : 42; } }
In het product werd geprobeerd twee methoden met dezelfde naam voor verschillende parameter types in een klasse te implementeren. Na compilatie werd de methode "vervangen" door de laatste declaratie, werden alle andere versies genegeerd, en verschenen er bugs.
Voordelen:
Nadelen:
Verschillende handtekeningen met union-type parameters gemaakt, en in de methode zijn alle varianten verwerkt via type guards. De compiler waarschuwde onmiddellijk voor typeproblemen.
Voordelen:
Nadelen: