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
解答思路
第一步:
问传入的是不是Promise这种类型的
||
再问一下这个any参数(断言了)x是不是Promise这种类型的
|| 是 => 不是 如果是 T extends Promise 的 就是 x, 不是就是 never
把x赋值给T 当成变量 进行自调
知识点
分别用到了
-
extends
-
<> 泛型传参
-
infer x 断言
-
三元
-
never用法
题目虽然是放到easy mode里面的,但每一步都是值得细细去推敲和品位的。为以后中等题、高难度题目奠定一定的基础,一步一步,做到知其然知其所以然。