javascript - 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
解决方案
运算符没有正式的重载()
,但该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);
推荐阅读
- javascript - 仅通过特定键、值对的错误值过滤数组
- python - ValueError: Found array with dim 3. Estimator expected <= 2. 如何在随机森林回归器上使用它?
- flutter - Flutter 中的自定义 SliverAppBar
- javascript - Protractor 中的 Promise 是如何解决的?
- python - 子类 __init__ 中的 NameError:未定义“自我”
- html - 响应式 iframe 仍然有滚动条并且没有缩放
- python - Selenium:“WebDriver”对象没有属性“Chrome”(将桌面更改为移动设备)
- asp.net-core - signalR - 向特定用户发送消息
- node.js - 如何在 PouchDB 中使用 medeadown 作为 leveldown 的替代方法
- css - MaterialUi 全局设置 fontSize 比例