首页 > 解决方案 > ES6 / TypeScript 中是否存在“运算符重载”?(或如何使对象可调用)

问题描述

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

标签: javascripttypescriptoperator-overloadinginvoke

解决方案


运算符没有正式的重载(),但该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);

游乐场链接

这是由于 3.1 中的新特性称为函数声明上的属性分配

在 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); 

游乐场链接


推荐阅读