【发布时间】:2017-12-03 19:41:44
【问题描述】:
下面第2节中的代码(工作示例here)基于第1节中的代码,但改为使用箭头函数,它基于Toward Resusable Charts中的Mike Bostock模式,即返回一个包含其他函数的函数。
如果我尝试在 typescript(演示 here)中运行第 1 节或第 2 节中的代码,它会说方法 addToChart 和 stop 在类型 (selection: any) => () => void 上不存在。
如何让 typescript 识别添加到返回函数的函数属性(在本例中为 addToChart 和 stop)?
第 1 节
const mychart = function (){
let stop = false;
const chart = function(selection){
function tick(){
console.log("tick");
}
return tick;
};
// Adding a function to the returned
// function as in Bostock's reusable chart pattern
chart.addToChart = function(value){
console.log("addToChart");
return chart;
};
chart.stop = function(){
return stop = true;
}
return chart;
}
const a = mychart();
const tick = a();
tick(); //logs tick
a.addToChart(); //logs "addToChart"
第 2 节
const mychart = () => {
let stop = false;
const chart = (selection) => {
function tick(){
console.log("tick");
}
return tick;
};
chart.addToChart = (value) => {
console.log("addToChart");
return chart;
};
chart.stop = () => {
return stop = true;
}
return chart;
}
const a = mychart();
const tick = a();
tick(); //logs tick
a.addToChart(); //logs "addToChart"
【问题讨论】:
-
对于任何从我的关于赏金的推文中获得的人,我很确定问题中的普通函数与箭头函数的区别有点牵强。无论词法范围如何,TypeScript 都难以处理这种代码风格。更大的问题是如何在 TS 中注释“带有 getter 和 setter 的闭包”风格的代码。
标签: javascript typescript d3.js