
可以递归 +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有两种情况:
如果U是Promise类型,则需要递归检查。对应的代码是:
U extends Promise<any> ? MyAwaited<U> : U
如果是普通返回值类型,则直接返回U。
MyAwaited的含义,是为了避免用户传入非Promise function。
如果用户违反规则,TypeScript会按报错处理。

比较简单
type If<C, T, F> = C extends true? T:F;


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;

比较简单,使用扩展运算符即可。
type Push<T extends any[],U> = [...T,U]