TypeScript ondersteunt geen directe operatoroverloading — alleen simulatie van dit gedrag op functieniveau/klassen is mogelijk, aangezien JavaScript (en de transformatie van TypeScript naar JS) geen mogelijkheid biedt om het gedrag van standaardoperators (+, *, - enz.) voor gebruikerstypes te wijzigen.
Achtergrond: in talen zoals C++ of C# is het mogelijk om eigen gedrag voor operators te definiëren bij het werken met objecten. In TypeScript (en JavaScript) is dit niet het geval, omdat de output gewone JS-code is, waarin operators strikt zijn gekoppeld aan interne types.
Probleem: bij het ontwikkelen van klassen met abstracte entiteiten (bijvoorbeeld vectors, matrices, geldbedragen, enz.) is het soms nodig om een gemakkelijke interactie via operators te implementeren. TypeScript heeft geen syntaxis die dit op een native manier mogelijk maakt.
Oplossing: om operatoroverloading te simuleren, worden methoden met duidelijke namen (add, mul, sub) gemaakt, soms worden statische methoden of hulpfuncties gebruikt. Bovendien kan expliciete typecasting worden geïmplementeerd via de valueOf-methode, maar dit is niet voldoende voor volledige overloading van alle operators, en deze oplossing werkt alleen voor bepaalde operators voor primitieve waarden.
Codevoorbeeld:
class Vector2D { constructor(public x: number, public y: number) {} add(v: Vector2D): Vector2D { return new Vector2D(this.x + v.x, this.y + v.y); } } const v1 = new Vector2D(1, 2); const v2 = new Vector2D(3, 4); const result = v1.add(v2); // Vector2D { x: 4, y: 6 }
Belangrijke kenmerken:
add, sub)valueOf-methode werkt alleen voor bepaalde operators, beperktAls valueOf/toString is gedefinieerd, zal operator + overload werken voor klassen?
Nee. valueOf beïnvloedt alleen het gedrag bij typecasting naar een primitief. Voor de operators + (zoals stringconcatenatie of getalsoptelling) kan dit onverwachte resultaten opleveren, andere operators zijn niet configureerbaar.
class Currency { constructor(private amount: number) {} valueOf() { return this.amount; } } const c1 = new Currency(10); const c2 = new Currency(5); console.log(c1 + c2); // 15, maar dit is geen Currency-object!
Kan Proxy worden gebruikt voor operatoroverloading in TypeScript?
Nee. Proxy maakt het mogelijk om toegang tot eigenschappen en methoden te onderscheppen, maar niet om met operators te werken (+, *, enz.), deze werken alleen met ingebouwde types.
Kan een operator "overloaded" worden via een declaratie in een interface of type?
Nee. In interfaces kunnen alleen methoden en functietekens worden beschreven, operatoroverloading zoals in C# (operator+) kan niet worden beschreven.
Een ontwikkelaar voegde valueOf toe aan de Currency-klasse om een numerieke weergave te krijgen en wiskundige bewerkingen rechtstreeks uit te voeren (currency1 + currency2). Daardoor ging de semantiek verloren; het resultaat van de optelling is een eenvoudig getal, geen valutaobject, wat het onmogelijk maakte om het type van de retourwaarde te volgen.
Voordelen:
Nadelen:
In de Vector-klasse is er een add-methode geïmplementeerd die een nieuwe Vector retourneert. Strikt getypeerd, geen ambiguïteiten mogelijk.
Voordelen:
Nadelen: