我正在写一个函数的类型。
我使用这个简单的代码示例使其更容易理解:
const getValues: <T extends Array<() => any>>(
...args: T
) => T extends Array<() => infer R> ? R[] : null = (...args) =>
args.map((arg) => arg());
const values = getValues(
() => "a",
() => 123
);
我希望values
的类型为[string, number]
,但它的类型为(string|number)[]
2条答案
按热度按时间rur96b6h1#
找到了!
9jyewag02#
要确保
values
数组被推断为[string, number]
而不是(string|number)[]
,可以更新getValues
函数的类型。下面是代码的调整版本:通过使用Map类型
{ [K in keyof T]: R }
,我们确保结果类型getValues
是一个与输入数组长度相同的数组,其中每个元素都具有推断类型R
。在这种情况下,R
将被推断为第一个函数的string
和第二个函数的number
,从而导致values
变量的所需类型[string, number]
。