TypeScript数组类型推导:保留索引信息的实现方案
解决TypeScript中getValues函数返回元组类型的问题
你的问题在于当前的类型定义会把所有函数的返回值合并成联合类型,最终返回(string|number)[]而不是期望的元组[string, number]。原因是T extends Array<() => infer R>这个条件类型会将数组中所有函数的返回类型推断为一个联合类型R,而非保留每个位置的具体类型。
要让返回值保持元组结构,需要用映射元组的方式,逐个提取每个输入函数的返回类型:
修改后的代码
const getValues = <T extends readonly (() => any)[]>(...args: T): { [K in keyof T]: T[K] extends () => infer R ? R : never } => args.map((arg) => arg()) as any; const values = getValues(() => "a", () => 123); // 类型为 [string, number]
或者用ReturnType工具类型简化写法:
const getValues = <T extends readonly (() => any)[]>(...args: T): { [I in keyof T]: ReturnType<T[I]> } => args.map(arg => arg()) as any;
原理说明
- 泛型
T约束为只读函数数组,确保能正确推断元组结构 - 映射类型
{ [K in keyof T]: ... }会遍历元组的每个索引位置,对每个位置的函数类型单独提取返回值类型,从而生成对应的元组类型 - 由于
Array.prototype.map默认返回普通数组类型,这里用as any断言来匹配我们定义的元组类型,实际运行时逻辑和原代码一致
内容的提问来源于stack exchange,提问作者Yuval Saraf
相关产品推荐
相关产品推荐

