Type-challenges(第二部分)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Type-challenges(第二部分)相关的知识,希望对你有一定的参考价值。

Type-challenges(第二部分)

189 Awaited

可以递归 +infer 判断。

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

先用条件推断,泛型T是否是Promise返回,并用infer U指代返回值。
U有两种情况:

  • 普通返回值类型
  • Promise类型

如果UPromise类型,则需要递归检查。对应的代码是:

 U extends Promise<any> ? MyAwaited<U> : U 

如果是普通返回值类型,则直接返回U

MyAwaited<T extends Promise<any>>的含义,是为了避免用户传入非Promise function
如果用户违反规则,TypeScript会按报错处理。


268 IF

比较简单

type If<C, T, F> = C extends true? T:F;

533 Concat


898 Includes

export type Equals<X, Y> = 
  (<T>() => T extends X ? "A" : "B") extends 
  (<T>() => T extends Y ? "A" : "B")
  ? true
  : false;

type Includes<T extends readonly any[], U> = T extends [
  infer TargetType,
  ...infer RestTypes
]
  ? Equals<TargetType, U> extends true
    ? true
    : Includes<RestTypes, U>
  : false;

3057 Push

比较简单,使用扩展运算符即可。

type Push<T extends any[],U> = [...T,U]

以上是关于Type-challenges(第二部分)的主要内容,如果未能解决你的问题,请参考以下文章

参考手册目录__第二部分

作业4(第二部分)

实验二 第二部分

实验二 第二部分

实验二 第二部分

Android 上的协程(第二部分):入门