跳到主要内容

类型体操

模式匹配做提取

type GetReturnType<Func extends Function> = 
Func extends (...args: any[]) => infer ReturnType
? ReturnType
: never;

重新构造做变换

type UppercaseKey<Obj extends Record<string, any>> = { 
[Key in keyof Obj as Uppercase<Key & string>]: Obj[Key]
}

递归复用做循环

type StringToUnion<Str extends string> = 
Str extends `${infer First}${infer Rest}`
? First | StringToUnion<Rest>
: never;

数组长度做计数

type BuildArray<
Length extends number,
Ele = unknown,
Arr extends unknown[] = []
> = Arr['length'] extends Length
? Arr
: BuildArray<Length, Ele, [...Arr, Ele]>;

type Subtract<Num1 extends number, Num2 extends number> =
BuildArray<Num1> extends [...arr1: BuildArray<Num2>, ...arr2: infer Rest]
? Rest['length']
: never;