如何让TypeScript的asyncMap仅指定返回类型,自动推断参数类型
解决asyncMap泛型仅需手动指定返回类型的问题
你可以通过调整泛型参数的顺序,让TypeScript自动推断数组元素类型T,仅需手动指定回调的返回类型O。修改后的函数如下:
function asyncMap<O, T>(arr: T[], asyncFn: (t: T) => Promise<O>): Promise<O[]> { return Promise.all(arr.map(asyncFn)); }
调用方式
现在你可以只指定返回类型O,数组类型T会被TypeScript自动推断:
asyncMap<number>(stringArray, async (singleString) => Number(singleString))
原理说明
TypeScript的泛型推断规则会优先从函数的输入参数推断未显式指定的泛型参数。调整泛型顺序为<O, T>后,你手动指定的O会被绑定到返回类型,而T则会从传入的arr参数(比如stringArray是string[])自动推断为string,回调函数的参数类型也会随之确定。
进一步简化(可选)
如果不想在回调里写async时还要手动处理Promise包装逻辑,可以把函数定义调整为允许回调返回O或Promise<O>,兼顾同步/异步回调的场景:
function asyncMap<O, T>(arr: T[], asyncFn: (t: T) => O | Promise<O>): Promise<O[]> { return Promise.all(arr.map(asyncFn)); }
调用时依然保持简洁,复杂逻辑场景下也无需手动指定返回类型:
// 同步回调也支持 asyncMap<number>(stringArray, (singleString) => Number(singleString)) // 复杂异步逻辑 asyncMap<number>(stringArray, async (singleString) => { const processed = await someAsyncOperation(singleString); return Number(processed); })
这样就解决了复杂回调场景下TypeScript无法正确推断返回类型的问题,同时避免了每次手动编写Promise<>的繁琐。
内容的提问来源于stack exchange,提问作者BigBrainAFK
相关产品推荐
相关产品推荐

