【问题标题】:create a generic function returning a function with the same signature创建一个通用函数,返回具有相同签名的函数
【发布时间】:2015-05-13 22:32:15
【问题描述】:

在 Typescript 中,我想创建一个函数,该函数将接受一个函数并返回一个具有相同输入输出的函数。函数本身需要是通用的。这样它就可以接受任意数量的参数并返回任意类型。

function improveFunction <T,U>(func:'that takes T and returns U') : (T):U {
  var newFunc = doDomethingToTheFunction(func); 
  return newFunc;
}

如果我返回函数本身,这将起作用。但是由于我使用 arguments 特殊参数来能够接受任意数量的参数,我实际上是在创建一个打字稿编译器无法理解的新函数。

编辑:

我又做了一个变种

(U => T) to (U => Promise<T>)

function ddd<T>(func: (...x: any[]) => T) : (...x: any[]) => ng.IPromise<T> {
    // return a function returning a promise of T;
}

【问题讨论】:

    标签: generics typescript


    【解决方案1】:

    给你:

    function f<A extends Function>(a:A):A {
        var newFunc = (...x:any[]) => {
            console.log('('+x.join(',')+') => ', a.apply(undefined, x));
            return null;
        }
        return <any>newFunc;
    }
    
    function a(j:string, k:number): boolean {
        return j === String(k);
    }
    
    var b = f(a);
    
    b("1", 1);
    b("a", 2);
    b('123','123'); // ERROR
    

    【讨论】:

    • 及时!我自己刚刚找到了一个类似的解决方案:) 通过双重转换function(){}。但这更好。谢啦。我的意思是它仍然是双重演员,一个只是隐含的。但是使用 ...x 语法很不错。
    • 天才!你在哪里找到这些东西?
    • 大量的业余时间编码......遗憾的是,据我所知没有捷径:(不是天生的超级聪明......足够聪明
    • 虽然这段代码有一个问题... f 函数的类型好像它会返回与其a 参数相同的值,但它返回的是空值。上面的代码将与输入一致:ts function f&lt;A extends Function&gt;(a:A):A { let newFunc = (...x:any[]) =&gt; { let result = a.apply(undefined, x) console.log('('+x.join(',')+') =&gt; ', ); return result; } return &lt;any&gt;newFunc; } 我正在使用letvar 也足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多