He definido algunas funciones en este objeto dentro de una calculator de funciones porque quiero encadenarlas. Mi objetivo es sobrecargar la función addNumber pero parece que no puedo obtener la sintaxis correcta.
A continuación se muestra un ejemplo de lo que quiero lograr (no funcionará porque la sintaxis es incorrecta)
const calculator = () => { return { result: 0, addNumber(a: number) : number; addNumber(a: number | b: number): number; addNumber(a: number | b: string): number { // Implementation to add numbers depending on function overload return this; }, multiplyNumber(a) { this.result = this.result * a; return this; }, log() { console.log(this.result); } }; } // logs 10 calculator().addNumber(10).log(); // logs 25 calculator().addNumber(10,15).log(); // logs 25 calculator().addNumber(10,'15').log();Este fue el ejemplo que me dio la idea, sin embargo, la función se define normalmente. ¿Cuáles son algunas formas en que puedo sobrecargar una función que está definida en el objeto?
function makeDate(timestamp: number): Date; function makeDate(m: number, d: number, y: number): Date; function makeDate(mOrTimestamp: number, d?: number, y?: number): Date { if (d !== undefined && y !== undefined) { return new Date(y, mOrTimestamp, d); } else { return new Date(mOrTimestamp); } } const d1 = makeDate(12345678); const d2 = makeDate(5, 5, 5); const d3 = makeDate(1, 3);Si está dispuesto a cambiar a una clase anónima, entonces es bastante simple sobrecargarse:
const calculator = () => { return new class { result = 0; addNumber(a: number) : this addNumber(a: number, b: number): this addNumber(a: number, b: string): this addNumber(a: number, b?: number | string): this { // Implementation to add numbers depending on function overload return this; } multiplyNumber(a: number) { this.result = this.result * a; return this; } log() { console.log(this.result); } }; }Los métodos literales de objetos y las expresiones de funciones no admiten la sobrecarga. La única otra opción es usar una expresión de función con una aserción de tipo:
const calculator = () => { return { result: 0, addNumber : function (a: number, b?: number | string) { return this; } as { <T>(this: T, a: number) : T <T>(this: T, a: number, b: number): T <T>(this: T, a: number, b: string): T } }; }