代码之家  ›  专栏  ›  技术社区  ›  NSjonas

接受函数并返回包含参数子集的函数的Typescript函数

  •  1
  • NSjonas  · 技术社区  · 7 年前

    所以这可能很难理解,但现在它来了。。。

    我想创建一个函数 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 & a2 如果传递函数中存在; s 将被排除在外)。

    因此,如果我通过:

    function testFunc(x: string, y: number): number{
      return x.length + y;
    }
    
    const x = f(testFunc);
    

    我希望 x 待输入类型 (a1: number) => number .然而,我却 (a1: {}) => {} 。。。

    我想做的事可能吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ryan Cavanaugh    7 年前

    您有太多的自由类型参数,这会打乱泛型推理。函数应如下所示(为简洁起见,省略了额外的重载):

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