此页内容

约 330 字大约 1 分钟

2022-12-01

提问

Github: Awaited

假如我们有一个 Promise 对象,这个 Promise 对象会返回一个类型。在 TS 中,我们用 Promise 中的 T 来描述这个 Promise 返回的类型。请你实现一个类型,可以获取这个类型。

例如:Promise<ExampleType>,请你返回 ExampleType 类型。

type ExampleType = Promise<string>

type Result = MyAwaited<ExampleType> // string

解题思路

这个挑战中,需要对类型 Promise<ExampleType> 进行展开,展开 指的是,从一个类型中提取其内部的类型。 在 typescript 中,可以通过 条件类型的类型推断,将推断结果赋值给 类型参数,这里需要借助 关键词 infer。 需要注意的是,条件类型的类型推断,只能在条件分支为 true 中可以使用 类型参数。

在题目的示例中,Promise<string> 展开类型为 string ,但我们需要处理 T 的任意情况,包括 <Promise<Promise<string>>。这时候还需要运用到 typescript 的 类型递归,直到不能展开为止,这个过程是调用 MyAwaited自身实现的。

答案

type MyAwaited<T> = T extends PromiseLike<infer R>
  ? MyAwaited<R>
  : T

参考