所以...这可能很难遵循,但在这里......
我想创建一个函数f()
,它接受一个函数作为它的参数,并返回一个新函数,它具有相同的参数排除第一个参数(可以是具体打字)。
function f<R, A extends (s: string) => R>(func: A): () => R; // no extra params
function f<R, T1, A extends (s: string, a1: T1) => R>(func: A): (a1: T1) => R; // 1 extra
function f<R, T1, T2, A extends (s: string, a1: T1, a2: T2) => R>(func: A): (a1: T1, a2: T2) => R; // 2 extra
function f(func: (...x: any[]) => any) {
return (...x) => {
return func('hello', ...x); //call function. 'hello will always be passed as first param, followed by the rest
};
}
在此示例中,f()
应该基本上采用第一个参数是字符串(s
)的任何函数,并返回一个包含0到2个参数的新函数(a1
&amp; { {1}}如果在传递的函数中存在,则a2
将被排除在外)。
所以,如果我要通过:
s
我希望function testFunc(x: string, y: number): number{
return x.length + y;
}
const x = f(testFunc);
为x
类型。但是,我得到的是(a1: number) => number
...
我尝试做的甚至可能吗?
答案 0 :(得分:2)
你有太多的自由类型参数,它搞乱了一般的推理。该函数应如下所示(为简洁省略了额外的重载):
function f<R>(func: (s: string) => R): () => R;
function f<R, T1>(func: (s: string, a1: T1) => R): (a1: T1) => R; // 1 extra
function f(func: (...x: any[]) => any) {
return (...x) => {
return func('hello', ...x); //call function. 'hello will always be passed as first param, followed by the rest
};
}
function testFunc(x: string, y: number): number{
return x.length + y;
}
// x: (a1: number) => number
const x = f(testFunc);