如何让TypeScript函数返回类型匹配参数Promise字典的解析类型
问题:TypeScript Promise字典解析函数的类型匹配优化
我正在编写一个TypeScript函数,该函数接收值为Promise的键值对字典,返回对应Promise解析结果的键值对字典。目前代码可实现功能,但无法让返回类型中每个键的类型与输入Promise的解析类型一一匹配。例如输入{foo: Promise<string>, bar: Promise<number>}时,希望返回类型为{foo: string, bar: number},而非仅保证值不是Promise的泛型字典。现有代码如下:
interface IArg{ [key: string]: Promise<any> } interface IResult{ [key: string]: any extends Promise ? never : any} public async promiseProps(obj: IArg): Promise<IResult>{ return Promise.all(Object.values(obj)).then( (values) => { const keys: string[] = Object.keys(obj); const length = keys.length; const d: IResult = {}; for(let i = 0; i < length; i++){ d[keys[i]] = values[i]; } return d } ) }
解决方案:使用泛型与类型映射实现精确类型匹配
要让返回类型和输入的Promise字典类型一一对应,需要利用TypeScript的泛型和类型映射特性,对代码的类型定义进行如下修改:
// 类型映射:将输入的Promise字典转换为解析后的结果字典 type ResolvedPromiseDict<T extends Record<string, Promise<any>>> = { [K in keyof T]: T[K] extends Promise<infer R> ? R : never; }; public async promiseProps<T extends Record<string, Promise<any>>>(obj: T): Promise<ResolvedPromiseDict<T>> { const keys = Object.keys(obj) as Array<keyof T>; const values = await Promise.all(Object.values(obj)); const result = {} as ResolvedPromiseDict<T>; for (let i = 0; i < keys.length; i++) { result[keys[i]] = values[i]; } return result; }
关键修改说明
- 泛型参数
T:约束为值是Promise的字符串键字典,让TypeScript能捕获输入对象的具体键名和对应的Promise类型,而非宽泛的string键 ResolvedPromiseDict类型映射:通过[K in keyof T]遍历输入字典的每个键,再用infer R提取Promise的解析类型,实现每个键的类型精准映射,确保输出类型和输入类型一一对应- 类型断言:将
Object.keys(obj)断言为Array<keyof T>,避免TypeScript将键视为宽泛的string;将空对象断言为ResolvedPromiseDict<T>,确保类型匹配通过编译
效果验证
当调用promiseProps({ foo: Promise.resolve("test"), bar: Promise.resolve(456) })时,TypeScript会正确推断返回类型为Promise<{ foo: string; bar: number }>,完全符合预期的类型匹配要求。
内容的提问来源于stack exchange,提问作者aturc
相关产品推荐
相关产品推荐

