declare namespace TypeUtil { type Noop = (...args: any) => any; type UnionInclude = K extends keyof T ? true : false; type GetFunArgs = F extends (...args: infer P) => any ? P : never; type Writable = { [K in keyof T]: T[K] }; type FirstOfArray = T extends [infer First, ...infer _Rest] ? First : never; type LastOfArray = T extends [...infer _Rest, infer Last] ? Last : never; // union to tuple type Union2IntersectionFn = (T extends unknown ? (k: () => T) => void : never) extends (k: infer R) => void ? R : never; type GetUnionLast = Union2IntersectionFn extends () => infer I ? I : never; type UnionToTuple = [T] extends [never] ? R : UnionToTuple>, [GetUnionLast, ...R]>; }