declare namespace TypeUtil { type Noop = (...args: any) => any; interface DataType { number: number; string: string; boolean: boolean; null: null; undefined: undefined; symbol: symbol; bigInt: bigint; object: Record; array: Array; function: (...args: any[]) => any | void; date: Date; regExp: RegExp; promise: Promise; set: Set; map: Map; file: File; } type DataTypeStringKey = keyof DataType; type DataTypeString = `[object ${Capitalize}]`; type UnionInclude = K extends keyof T ? true : false; 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]>; }