ts-challenges awaited

297 阅读1分钟

Awaited

题目

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

例如: Promise, 请返回ExampleType类型

type ExampleType = Promise<string>

type Result = MyAwaited<ExampleType> // string

例子1:

import type { Equal, Expect } from '@type-challenges/utils'

type X = Promise<string>

type cases = [
    Expect<Equal<MyAwaited<X>, string>>
]

这个例子就是传入string, 返回string。

那答案就可以得出:

type MyAwaited = any

|| 转换成

type MyAwaited<T extends Promise<any>> = T extends Promise<infer x> ? x : never

例子2:

type Y = Promise<{ field: number }>

type cases = [
    Expect <Equal<MyAwaited<Y>, { field: number }>>
]

可以看出例子2, 传入{ field: number },返回的也是 { field: number },那答案也是如同例子1一样。

例子3:

type Z = Promise<Promise<string | number>>

type cases = [
    Expect<Equal<MyAwaited<Z>, string | number>>
]

可以看出例子3,传入Promise<string | number>, 返回的是 string | number

那么例子1和2的答案就不适用与这种了,例子1和2是传什么返回什么

type MyAwaited<T extends Promise<any>> = T extends Promise<infer x> ? x : never

然而例子3是传入Promise<string | number>, 返回这个Promise的参数。

type MyAwaited<T extends Promise<any>> = T extends Promise<infer x> ? x : never

|| 转换

type MyAwaited<T extends Promise<any>> = T extends Promise<infer x> ? x extends Promise<any> ? MyAwaited<x> : x : never

解答思路

Kapture 2022-07-07 at 17.32.43.gif

第一步:

问传入的是不是Promise这种类型的

||

再问一下这个any参数(断言了)x是不是Promise这种类型的

|| 是 => 不是 如果是 T extends Promise 的 就是 x, 不是就是 never

把x赋值给T 当成变量 进行自调

知识点

分别用到了

  • extends

  • <> 泛型传参

  • infer x 断言

  • 三元

  • never用法

题目虽然是放到easy mode里面的,但每一步都是值得细细去推敲和品位的。为以后中等题、高难度题目奠定一定的基础,一步一步,做到知其然知其所以然