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类型
如果U
是Promise
类型,则需要递归检查。对应的代码是:
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(第二部分)的主要内容,如果未能解决你的问题,请参考以下文章