我正在尝试使用打字稿,我正在尝试创建一个基本上是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
的类型?
答案 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;
});
someValue
的类型为number
。