实现Awaited

261 阅读2分钟

题目解析

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
  1. T extends Promise<infer U>
    • 这是一个条件类型,用于检查T是否是一个Promise类型。
    • 如果TPromise,则infer U提取出Promise的解析值类型,并且将其命名为U
  2. MyAwaited<U>:
    • 递归调用MyAwaited,以处理嵌套的Promise
    • 如果U仍然是一个Promise,则继续提取其内部类型,知道提取最终的解析值类型。
  3. :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

本人是新手,如果文章中有不正确的,请各位大佬指正。