题目解析
在TypeScript中,Awaited是一个内置的工具类型,用于处理Promise和异步操作的结果类型,也可以处理嵌套的Promise。它可以帮助我们提取Promise的返回值类型,或者处理异步函数的返回值类型。
示例分析
type ExampleType = Promise<string>
type ExampleType1 = number
type ExampleType2 = 1
type ExampleType3 = Promise<Promise<boolean>>
type ResultType = Awaited<ExampleType> // string
type ResultType1 = Awaited<ExampleType1> // number
type ResultType2 = Awaited<ExampleType2> // 1
type ResultType3 = Awaited<ExampleType3> // boolean
再这个示例中,如果是Promise或者是嵌套的Promise类型,Awaited会帮助我们提取返回之类型,如果是普通的类型就直接返回。
题解
type MyAwaited<T> = T extends Promise<infer U> ? MyAwaited<U> : T
type PromiseType = Promise<string>
type PromiseType1 = number
type PromiseType2 = Promise<Promise<boolean>>
type PromiseType3 = 1
type ResultType = MyAwaited<PromiseType> // string
type ResultType1 = MyAwaited<PromiseType1> // number
type ResultType2 = MyAwaited<PromiseType2> // boolean
type ResultType3 = MyAwaited<PromiseType3> // 1
T extends Promise<infer U>:- 这是一个条件类型,用于检查
T是否是一个Promise类型。 - 如果
T是Promise,则infer U提取出Promise的解析值类型,并且将其命名为U。
- 这是一个条件类型,用于检查
MyAwaited<U>:- 递归调用
MyAwaited,以处理嵌套的Promise。 - 如果
U仍然是一个Promise,则继续提取其内部类型,知道提取最终的解析值类型。
- 递归调用
:T:- 如果
T不是Promise,则返回T本身。
- 如果
应用
1. 提取Promise的返回值类型
type ExampleType = Promise<string>;
type ResultType = MyAwaited<ExampleType>; // ResultType 的类型是 string
在这个例子中,MyAwaited<ExampleType>提取了Promise<string>的解析值类型为string。
2. 处理嵌套的Promise
type NestedPromiseType = Promise<Promise<number>>;
type ResultType = MyAwaited<NestedPromiseType>; // ResultType 的类型是 number
在这个例子中,MyAwaited<NestedPromiseType>处理了嵌套的Promise,最终提取出number类型。
3. 处理异步函数的返回值类型
async function fetchData(): Promise<string> {
return "Hello, World!";
}
type FetchDataType = ReturnType<typeof fetchData>; // Promise<string>
type ResultType = MyAwaited<FetchDataType>; // ResultType 的类型是 string
在这个例子中,MyAwaited<FetchDataType>提取了异步函数FetchDataType的返回值类型string。
本人是新手,如果文章中有不正确的,请各位大佬指正。