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的参数名没有保留。此外,它在重载函数上的效果也很差。