ES6 / TypeScript 中有 "operator overloading" 吗? (或如何使对象可调用)

Is there "operator overloading" in ES6 / TypeScript? (or how to make object invokable)

我离开 JS 开发有一段时间了,想知道现代 JavaScript 或 TypeScript 中是否有类似的东西?

C++

struct Functor {
    double operator()(double value) { ... }

科特林:

class Whatever {
    operator fun invoke(value: Double): Double { ... }

在 ES5 中可以这样做:

var interpolator = function (value) {
    var t = (value - domainStart) / domainDelta
    return (1 - t) * rangeStart + t * rangeEnd;
}
interpolator.invert = function () { ... }
interpolator.setDomain = function (a, b) { ... }
interpolator.setRange = function (a, b) { ... }

// and then use like so
interpolator.setDomain(0, 1)
interpolator.setRange(50, 200)
let rangeValue = interpolator(0.5) // 125

() 运算符没有正式的重载,但 ES5 技术在现代 JS 中也能正常工作。

就 Typescript 的故事而言,您的代码几乎与 Typescript 3.1 中的一样

function interpolator(value: number) {
    return value
}
interpolator.invert = function () {  }
interpolator.setDomain = function (a : number, b: number) {  }
interpolator.setRange = function (a: number, b: number) {  }

// and the use like so
interpolator.setDomain(0, 1)
interpolator.setRange(50, 200)
let rangeValue = interpolator(0.5) // 125);

Playgrounk link

这是由于 3.1 中的新功能 Property assignments on function declarations

在 3.1 之前,您需要一个额外的命名空间来实现具有额外成员的正确类型化的函数

function interpolator(value: number) {
    return value
}
namespace interpolator {
    export function invert() { }
    export function setDomain(a: number, b: number) { }
    export function setRange (a: number, b: number) { }
}

// and the use like so
interpolator.setDomain(0, 1)
interpolator.setRange(50, 200)
let rangeValue = interpolator(0.5) // 125); 

Playgrounk link