TypeScript中Awaited类型是什么?请详解其用途与工作原理
Awaited工具类型详解
什么是Awaited
TypeScript 4.5及以后新增的Awaited<T>工具类型,核心作用是提取Promise包裹的最终返回类型,同时能递归处理嵌套的Promise(比如Promise<Promise<T>>),模拟await操作在类型层面的行为。
工作原理
它的底层实现逻辑类似:
type Awaited<T> = T extends null | undefined ? T : // 处理null/undefined T extends PromiseLike<infer U> ? Awaited<U> : // 递归解析Promise T; // 非Promise类型直接返回自身
简单说就是通过条件类型的infer关键字,逐层提取Promise内部的类型,直到拿到最底层的非Promise类型。
核心用途
1. 提取Promise的返回类型
当你需要明确某个Promise函数最终返回的具体类型时,不用手动写嵌套的Promise内部类型:
// 示例函数 async function fetchData(): Promise<{ id: number; name: string }> { return { id: 1, name: "test" }; } // 提取返回类型 type FetchResult = Awaited<ReturnType<typeof fetchData>>; // 等价于 type FetchResult = { id: number; name: string }
2. 处理嵌套Promise
现实中可能遇到多层嵌套的Promise(比如第三方库返回的Promise<Promise<T>>),Awaited能自动递归解析:
type NestedPromise = Promise<Promise<number>>; type Unwrapped = Awaited<NestedPromise>; // 等价于 type Unwrapped = number
3. 处理联合类型的Promise
如果是多个Promise组成的联合类型,Awaited会逐个解析后再返回联合类型:
type MixedPromises = Promise<string> | Promise<number>; type UnwrappedMixed = Awaited<MixedPromises>; // 等价于 type UnwrappedMixed = string | number
4. 模拟await的类型行为
在类型层面模拟await操作的效果,比如写工具函数的时候,明确异步操作后的类型:
function handleAsync<T>(input: Promise<T>): Awaited<T> { return input.then(res => res) as Awaited<T>; }
常见误区
- 不要把它和
ReturnType混淆:ReturnType是提取函数的返回类型(如果函数返回Promise,那它拿到的是Promise<T>),而Awaited是进一步提取Promise内部的T。 - 它只处理
PromiseLike类型(只要有then方法的类型都能被解析),不是Promise的类型会直接返回自身:
type NonPromise = Awaited<string>; // 等价于 type NonPromise = string
内容的提问来源于stack exchange,提问作者Bablu Ahmed
相关产品推荐
相关产品推荐

