TypeScript no soporta la sobrecarga de operadores directamente — solo es posible simular este comportamiento a nivel de funciones/clases, ya que JavaScript (y la transpilación de TypeScript a JS) no prevé la posibilidad de cambiar el comportamiento de los operadores estándar (+, *, -, etc.) para tipos personalizados.
Historia del asunto: en lenguajes como C++ o C# existe la posibilidad de definir un comportamiento propio para los operadores al trabajar con objetos. En TypeScript (y JavaScript) esto no se puede hacer, porque el resultado es código JavaScript común, donde los operadores están rigidamente vinculados a los tipos internos.
Problema: al desarrollar clases con entidades abstractas (por ejemplo, vectores, matrices, cantidades monetarias, etc.) a veces es necesario implementar un trabajo cómodo con ellas a través de operadores. En TypeScript no hay una sintaxis que permita hacer esto de manera nativa.
Solución: para simular la sobrecarga de operadores se crean métodos con nombres explícitos (add, mul, sub), a veces se utilizan métodos estáticos o funciones auxiliares. Además, se puede implementar una conversión explícita mediante el método valueOf, pero esto no es suficiente para una sobrecarga completa de todos los operadores y esta solución solo funciona para algunos operadores para valores primitivos.
Ejemplo de código:
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 }
Características clave:
add, sub)valueOf solo funciona para algunos operadores, de manera limitadaSi se define valueOf/toString, ¿funcionará la sobrecarga del operador + para clases?
No. valueOf solo afecta el comportamiento al convertir el tipo a un primitivo. Para el operador + (como la concatenación de cadenas o la suma de números) esto puede dar un resultado inesperado, los demás operadores no se configuran.
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, pero esto no es un objeto Currency!
¿Se puede usar Proxy para sobrecargar operadores en TypeScript?
No. Proxy permite interceptar el acceso a propiedades y métodos, pero no el funcionamiento de los operadores (+, *, etc.), que solo funcionan con tipos incorporados.
¿Se puede "sobrecargar" un operador a través de una declaración en la interfaz o el tipo?
No. En las interfaces solo se pueden describir métodos y firmas de funciones, no se pueden describir sobrecargas de operadores como, por ejemplo, en C# (operator+)
Un desarrollador agregó valueOf en la clase Currency para obtener una representación numérica y realizar operaciones matemáticas directamente (currency1 + currency2). Al final se perdía la semántica; el resultado de la suma es un simple número, no un objeto monetario, y no era posible rastrear el tipo de valor devuelto.
Ventajas:
Desventajas:
En la clase Vector se implementó un método add que devuelve un nuevo Vector. Está bien tipificado, no hay ambigüedades.
Ventajas:
Desventajas: