如何在 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
被正确输入为 number
但 someNum
被输入为 any
.
我想可能是因为我把func
的return类型打成了=> any
。
所以问题来了:
如何让 vs 代码知道 someNum
的类型?
首先我要说的是,在我看来这段代码非常不直观,如果将来有人需要阅读和理解这段代码,那么他将大饱口福。
话虽这么说,您所问问题的解决方案非常简单,只是很难用所有这些泛型看到它,因为答案只是:为 [=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;
});
someValue
的类型是number
。
我正在尝试使用打字稿,我正在尝试创建一个 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
被正确输入为 number
但 someNum
被输入为 any
.
我想可能是因为我把func
的return类型打成了=> any
。
所以问题来了:
如何让 vs 代码知道 someNum
的类型?
首先我要说的是,在我看来这段代码非常不直观,如果将来有人需要阅读和理解这段代码,那么他将大饱口福。
话虽这么说,您所问问题的解决方案非常简单,只是很难用所有这些泛型看到它,因为答案只是:为 [=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;
});
someValue
的类型是number
。