我离开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
答案 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);
这是由于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);