You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:27:50