Function Typescript接口:返回泛型函数的方法

Function Typescript接口:返回泛型函数的方法,function,typescript,interface,closures,Function,Typescript,Interface,Closures,有人知道如何为类方法定义接口,如: wrap(fn) { return function(){ ... // do something fn() } } 我正在绞尽脑汁想这个问题,基本上我如何定义参数的类型(和返回值)为函数?我假设您想要返回另一个具有相同类型fn的函数 class Wrapper { // generic for any fn, without handling parameter type // a return type is n

有人知道如何为类方法定义接口,如:

wrap(fn) {
  return function(){
    ... // do something
    fn()
  }
}

我正在绞尽脑汁想这个问题,基本上我如何定义参数的类型(和返回值)为
函数

我假设您想要返回另一个具有相同类型
fn
的函数

class Wrapper {

    // generic for any fn, without handling parameter type
    // a return type is not required: tsc infers from `return` statement.
    wrap<T extends Function>(fn: T) {
        return function () {
            // NOTE this version does not handle types of parameters.
            // you will have to use `arguments`
            return fn();
        } as any as T;
    }

    // generic for all unary fn
    // we can have correct type of arg1 in this way
    wrapF1<P1, R>(fn: (arg1: P1) => R) {
        const wrapped = function (arg1: P1) {
            return fn(arg1);
        }
        return wrapped;
    }

    // wrapF2, wrapF3, if you need more
}
类包装器{
//任何fn的泛型,不处理参数类型
//不需要返回类型:tsc从“return”语句推断。
包裹(fn:T){
返回函数(){
//注意:此版本不处理参数类型。
//你必须使用`参数`
返回fn();
}与T一样;
}
//所有一元fn的通用
//通过这种方式,我们可以获得正确的arg1类型
wrapF1(fn:(arg1:P1)=>R){
const wrapped=函数(arg1:P1){
返回fn(arg1);
}
返回包装;
}
//wrapF2,wrapF3,如果你需要更多
}

如果我做了
wrapper=wrap(fn),它会给我一个错误包装器()
错误TS2349:无法调用其类型缺少调用签名的表达式。类型“void”没有兼容的调用签名。
在您的示例中,
wrap
的类型是
(fn:()=>void)=>()=>void
。如果它位于对象(例如类实例)内部,则该对象的类型将是
{wrap(fn:()=>void):()=>void}
{wrap:(fn:()=>void)=>()=>void}
感谢@joketster的解释,在我的例子中是
debounce
函数,我真的不关心内部fn的参数…@teone很高兴知道这一点,因为
wrapF1
方法远远不够完美。首先,fn的参数名没有保留。此外,它在重载函数上的效果也很差。