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。