ES6 / TypeScript中是否存在“运算符重载”? (或如何使对象可调用)

时间:2018-10-09 15:15:07

标签: javascript typescript operator-overloading invoke

我离开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

1 个答案:

答案 0 :(得分:1)

()运算符没有形式上的重载,但是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