2022-04-01 14:47:57 +08:00
|
|
|
declare namespace TypeUtil {
|
|
|
|
type Noop = (...args: any) => any;
|
|
|
|
|
2022-07-28 00:30:10 +08:00
|
|
|
type UnionInclude<T, K extends keyof T> = K extends keyof T ? true : false;
|
|
|
|
|
2022-04-01 14:47:57 +08:00
|
|
|
type GetFunArgs<F extends Noop> = F extends (...args: infer P) => any ? P : never;
|
|
|
|
|
2022-07-30 22:16:42 +08:00
|
|
|
type Writable<T> = { [K in keyof T]: T[K] };
|
|
|
|
|
2022-07-28 00:30:10 +08:00
|
|
|
type FirstOfArray<T extends any[]> = T extends [infer First, ...infer _Rest] ? First : never;
|
|
|
|
|
|
|
|
type LastOfArray<T extends any[]> = T extends [...infer _Rest, infer Last] ? Last : never;
|
2022-08-24 19:21:22 +08:00
|
|
|
|
|
|
|
// union to tuple
|
|
|
|
type Union2IntersectionFn<T> = (T extends unknown ? (k: () => T) => void : never) extends (k: infer R) => void
|
|
|
|
? R
|
|
|
|
: never;
|
|
|
|
type GetUnionLast<U> = Union2IntersectionFn<U> extends () => infer I ? I : never;
|
|
|
|
|
|
|
|
type UnionToTuple<T, R extends any[] = []> = [T] extends [never]
|
|
|
|
? R
|
|
|
|
: UnionToTuple<Exclude<T, GetUnionLast<T>>, [GetUnionLast<T>, ...R]>;
|
2022-04-01 14:47:57 +08:00
|
|
|
}
|