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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:06:13