Typescript函数,它接受一个函数并返回一个带有参数子集的函数

时间:2018-05-11 21:11:57

标签: typescript generics

所以...这可能很难遵循,但在这里......

我想创建一个函数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 ...

我尝试做的甚至可能吗?

1 个答案:

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