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

How to get the implicit typing of function returns in TypeScript?

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

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

    // do stuff with in scope

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

以上是具有return值的普通IIFE。同样,我只是在这里进行试验,但我认为如果 IIFE 的参数先出现然后函数出现,这将更具可读性,例如

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

这个 using(...) 函数似乎并不难写,但现在我在 VS 代码中为智能感知输入这个函数时遇到了问题。

这是我到目前为止的想法:

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 的参数,但它没有键入 return 值。所以在这个例子中:

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

num 被正确输入为 numbersomeNum 被输入为 any.

我想可能是因为我把func的return类型打成了=> any

所以问题来了:

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

typescript playground

首先我要说的是,在我看来这段代码非常不直观,如果将来有人需要阅读和理解这段代码,那么他将大饱口福。

话虽这么说,您所问问题的解决方案非常简单,只是很难用所有这些泛型看到它,因为答案只是:为 [=22= 添加另一个泛型类型] 函数类型:

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