TypeScript异步函数ReturnType类型定义问题求助
解决TypeScript中logIt函数的Promise嵌套类型问题
问题的核心在于async函数的返回值会自动被包装为Promise,再加上你原有的泛型定义方式,导致了Promise嵌套的类型冲突。
方案一:调整泛型参数,直接指定Promise内部类型
重新定义泛型T为fn执行后resolve的结果类型,从根源避免嵌套:
async function logIt<T>(message: string, fn: () => Promise<T>): Promise<T> { try { const result = await fn(); return result; } catch (e) { console.log(message); throw e; } }
这样写的逻辑是:
fn被明确限定为返回Promise<T>的函数- await
fn()后得到T类型的值,async函数会自动将其包装为Promise<T>,正好匹配父类方法Promise<number>的返回类型,不会出现嵌套。
方案二:用Awaited提取Promise内部类型(保留原有泛型约束)
如果你想保留对fn的泛型约束,可以用TypeScript的Awaited工具类型解析Promise的内部值:
async function logIt<T extends () => Promise<any>>(message: string, fn: T): Promise<Awaited<ReturnType<T>>> { try { const result = await fn(); return result; } catch (e) { console.log(message); throw e; } }
具体解释:
ReturnType<T>获取fn的返回类型(比如示例中的Promise<number>)Awaited<ReturnType<T>>会解析Promise结构,提取出内部的number类型- 最终函数返回
Promise<number>,和父类方法的返回类型完全匹配。
修改后,你的functionOnWhatever方法就能正常返回Promise<number>,不会再出现类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Zack Newsham
相关产品推荐
相关产品推荐

