为自定义LazyPromise.all方法实现正确的类型推断
解决LazyPromise.all的类型推断问题
要让LazyPromise.all能正确推断出元组类型(比如[number, string])而非any[],需要利用TypeScript的泛型+映射类型实现精准的类型推导,具体改造如下:
改造后的代码实现
class LazyPromise { static all<T extends readonly (() => Promise<any>)[]>( lazies: T ): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }> { // 执行所有懒加载Promise,通过类型断言告知TS实际返回的是对应元组类型的Promise return Promise.all(lazies.map(lazy => lazy())) as Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }>; } }
关键逻辑说明
- 泛型约束
T:将T约束为只读的「返回Promise的函数元组」,确保TypeScript把传入的字面量数组推断为元组而非普通数组,保留每个元素的位置类型信息。 - 映射类型提取结果类型:通过
{ [K in keyof T]: Awaited<ReturnType<T[K]>> }遍历元组索引:ReturnType<T[K]>:获取每个函数返回的Promise<U>类型;Awaited<...>:提取Promise内部的resolve值类型U;- 最终生成与输入元组位置一一对应的结果元组类型。
- 类型断言:由于
Array.map默认返回普通数组类型,需要用as断言告诉编译器实际返回的是对应元组类型的Promise。
测试验证
const result = LazyPromise.all([ () => Promise.resolve(1), () => Promise.resolve('foo') ]).then(result => { // 此时result的类型会被正确推断为 [number, string] console.log(result); // 输出 [1, "foo"] });
如果传入更多不同类型的懒加载Promise,类型推断依然精准:
LazyPromise.all([ () => Promise.resolve(123), () => Promise.resolve('hello'), () => Promise.resolve(true) ]).then(res => { // res 类型为 [number, string, boolean] });
内容的提问来源于stack exchange,提问作者ar099968
相关产品推荐
相关产品推荐

