如何在TypeScript中获取函数的隐式类型返回?

时间:2016-08-28 19:57:22

标签: typescript iife

我正在尝试使用打字稿,我正在尝试创建一个基本上是IIFE的using(...)函数,但首先是参数而不是最后一个。

var someValue = (function (p0, p1) {
    // p0 is someGlobal
    // p1 is someOtherGlobal

    // do stuff with in scope

    return /*something*/;
}(someGlobal, someOtherGlobal));

以上是具有返回值的常见IIFE。同样,我只是在这里进行实验,但我认为如果IIFE的参数首先出现在函数中,这将更具可读性。

const someValue = using([someGlobal, someOtherGlobal], /*as*/ (p0, p1) => {
    // p0 is someGlobal p1 is someOtherGlobal
    // do stuff
    return /*something*/;
});

这个using(...)函数似乎并不难写,但现在我在VS代码中为intellisense输入此函数时遇到了麻烦。

这是我到目前为止所提出的:

function using<A, B, C, D, E, F>(
    params: A | [A, B] | [A, B, C] | [A, B, C, D] | [A, B, C, D, E, F],
    func: (p0: A, p1: B, p2: C, p3: D, p4: E, p5: F) => any
) {
    return func(
        params[0],
        params[1],
        params[2],
        params[3],
        params[4],
        params[5]
    );
}

此函数正确键入func的参数,但它不做的是键入返回值。所以在这个例子中:

const someValue = 42;
const someNum = using(someValue, num => num + 1);

num被正确输入为number,但someNum被输入any

我想可能是因为我将func的返回类型键入=> any

所以这就是问题:

如何让代码知道someNum的类型?

typescript playground

1 个答案:

答案 0 :(得分:1)

首先我想说这段代码在我看来是非常不直观的,如果将来有人需要阅读并理解这段代码,那么他就可以参加。

话虽如此,你所要求的解决方案非常简单,很难看到所有这些泛型,因为答案只是:为函数的返回类型添加另一个泛型类型:

function using<A, B, C, D, E, F, Return>(
    params: A | [A, B] | [A, B, C] | [A, B, C, D] | [A, B, C, D, E, F],
    func: (p0: A, p1: B, p2: C, p3: D, p4: E, p5: F) => Return
): Return {
    return func(
        params[0],
        params[1],
        params[2],
        params[3],
        params[4],
        params[5]
    );
}

const someNumber = 42;
const someString = 'whoo';
const someValue = using([someNumber, someString], (num, str) => {
    return num + str.length;
});

code in playground

someValue的类型为number