刚刚开始使用TS,我将如何输入类似......
的内容function once(fn) {
var haveResult = false;
var result = null;
return (...args) => {
if (!haveResult) {
haveResult = true;
result = fn.apply(this, args);
}
return result;
};
}
凡曾能获得任何参数的函数并返回任何参数。就像lodash的_.once
一样答案 0 :(得分:5)
您可以为函数类型使用泛型参数,并返回具有相同类型的新函数。不幸的是,由于每个参数都没有可变数量的类型参数,因此需要使用类型断言来获取辅助函数以匹配结果类型,但调用站点将正确推断所有参数:
function once<TFunction extends (...args: any[])=> any>(fn: TFunction): TFunction {
var haveResult = false;
var result: any = null;
return (function (this: any, ...args: any[]) {
if (!haveResult) {
haveResult = true;
result = fn.apply(this, args);
}
return result;
}) as any;
}
// Usage
class Test {
doStuff (t: string){
console.log('doStuff');
return 1;
}
constructor() {
this.doStuff = once(this.doStuff);
}
}
let t = new Test();
t.doStuff('s');
t.doStuff('s');