如何输入像_.once这样的东西

时间:2018-03-19 15:40:15

标签: typescript typescript-typings

刚刚开始使用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

一样

1 个答案:

答案 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');