Awaited<T>

最后更新:2026-10-22

Awaited<T> Awaited

Awaited<T> 模拟 await 的类型效果:把 Promise<T> 解开得到 T,嵌套 Promise(Promise<Promise<T>>)也会递归展开。想要"async 函数成功后的结果类型"时,Awaited<ReturnType<typeof fn>> 是标准组合。

分组工具类型
类型类型
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

// 简化版实现(官方版还处理 thenable)
type Awaited<T> = T extends Promise<infer V> ? Awaited<V> : T;

// 用法
type User = Awaited<ReturnType<typeof fetchUser>>;   // 解开 Promise<User>

⚙️ 参数

T任意类型:是 Promise(或 thenable)就递归解开,不是则原样保留

返回值:T 被 await 之后的类型:Promise 链全部展开后的最终值类型。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

1: Ada
done

(转译后运行输出;类型层面:LoadedUser 是 { id: number; name: string } 而非 Promise<...>——Awaited 已解开,user.id 才能直接访问)

💡 要点

ℹ️ 说明 Awaited 是递归条件类型:遇到 Promise 就 infer 出内部类型再对它调用 Awaited,直到不是 Promise 为止。这也是 TS 内部给 await 表达式推导类型的机制。
⚠️ 注意 Awaited 只在类型层"解开",不会替你等待。运行时忘记 await 拿到的仍是 Promise 对象——类型写对了不代表写 await 了。
💡 提示 组合技:Awaited<ReturnType<typeof fn>> 取 async 函数的成功结果;Promise.all 的结果类型里每个成员也各自经过 Awaited 展开。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q Awaited<T> 和 T extends Promise<infer U> 有什么区别?
A 非递归的自写条件类型只解开一层,嵌套 Promise<Promise<T>> 会漏;Awaited 官方版递归展开,还兼容 thenable(自定义 then 方法的对象)。要通用就用 Awaited。
Q await 一个普通值会发生什么?
A 运行时 await 非 Promise 值原样返回;类型上 Awaited<string> 也是 string。所以对"可能是 Promise"的值用 Awaited 推导类型总是安全的。
Q Promise.all 的结果类型怎么取?
A 不用手写:Promise.all 接收元组时返回类型自动是各成员 Awaited 展开后的元组。想引用这个类型就声明 const results = await Promise.all([...]),再用 typeof results。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏