Typescript中如何为Promise.all正确声明Map类型的入参与返回值
问题解决方案
你原来的代码存在两个核心问题导致报错:
- 类型声明完全不匹配:你给
promises变量声明的类型是Promise<Map<Item, Item>>,但实际赋值的是Map实例,两者完全不属于同一种类型,因此直接抛出了类型缺失的错误,同时Map本身也没有数组的push方法,逻辑上也无法运行。 - 异步逻辑没有和数组版本对齐:数组版本的逻辑是先收集所有单个异步任务的结果,全部完成后拼成数组返回;Map版本需要对应先收集所有异步键值对,全部完成后再拼成Map实例返回。
正确实现代码
export class Example { // 原有正常运行的Array版本保留参考 public withArray(): Promise<Item[]> { const promises: Promise<Item>[] = []; promises.push(Promise.resolve(Item)); return Promise.all(promises); } // 修正后的Map版本 public withMap(): Promise<Map<Item, Item>> { // 声明存储异步键值对的数组,每个Promise resolve后返回[键, 值]的元组 const promises: Promise<[Item, Item]>[] = []; // 向数组中添加异步键值对任务 promises.push(Promise.resolve([Item, Item])); // 所有异步任务完成后,用返回的键值对元组数组初始化Map实例 return Promise.all(promises).then(keyValuePairs => new Map(keyValuePairs)); } }
实现说明
Promise.all(promises)执行后返回的是Promise<[Item, Item][]>类型,resolve之后得到的是所有键值对元组组成的数组- Map构造函数原生支持传入键值对元组数组完成初始化,因此直接将
Promise.all返回的结果传入即可得到符合要求的Map<Item, Item>实例 - 整个方法的返回值类型和声明的
Promise<Map<Item, Item>>完全匹配,不会再抛出类型错误。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

