type-challenges: easy-awaited | infer 应该如何使用

type-challenges/README.md at main · TIMPICKLE/type-challenges · GitHub

 infer的理解: 二元一次方程的 x,是一个未知的变量。 

类比到TS, infer x 是指一个未知的类型。

If we have a type which is wrapped type like Promise. How we can get a type which is inside the wrapped type?

For example: if we have Promise<ExampleType> how to get ExampleType?

type ExampleType = Promise<string>

type Result = MyAwaited<ExampleType> // string

理解一下题目意思,你得解析出来promise的T的类型是什么,如果是联合类型,也需要解析出。

开始敲代码

测试用例:

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

type X = Promise<string>
type Y = Promise<{ field: number }>
type Z = Promise<Promise<string | number>>
type Z1 = Promise<Promise<Promise<string | boolean>>>
type T = { then: (onfulfilled: (arg: number) => any) => any }

type cases = [
  Expect<Equal<MyAwaited<X>, string>>,
  Expect<Equal<MyAwaited<Y>, { field: number }>>,
  Expect<Equal<MyAwaited<Z>, string | number>>,
  Expect<Equal<MyAwaited<Z1>, string | boolean>>,
  Expect<Equal<MyAwaited<T>, number>>,
]

首先:

1. extens限制类型

type MyAwait<T> = T extends Promise<>;

2. 然后使用infer X 来设置一个未知的类型

type MyAwait<T> = T extends Promise<infer X>;

3. 然后返回结果, 三元表达式

type MyAwait<T> = T extends Promise<infer X> ? X : never;

4. 现在解决 测试用例的第三个,嵌套的promise,使用递归

type Z1 = Promise<Promise<Promise<string | boolean>>>
type MyAwait<T> = T extends Promise<infer X> ? MyAwait<X> : never;

5 检查一下递归出口

type MyAwait<T> = T extends Promise<infer X> ? MyAwait<X> : T;

6. 再处理一下非promise类型的参数

type MyAwait<T> = T extends Promise<infer X> 
                  ? X entends Promise<unknow>
                  ? MyAwait<T>
                  : X
                  : never ;

woc看到github提交记录里有个b是这么写的,压缩大师:

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

https://github.com/type-challenges/type-challenges/issues/21580

又涉及到的知识,关于TS的Like是什么东西:

javascript - Why does TypeScript use "Like" types? - Stack Overflow

interface PromiseLike<T> {
    /**
     * Attaches callbacks for the resolution and/or rejection of the Promise.
     * @param onfulfilled The callback to execute when the Promise is resolved.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of which ever callback is executed.
     */
    then<TResult1 = T, TResult2 = never>(
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值