type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; type UnionToOvlds = UnionToIntersection void : never>; type PopUnion = UnionToOvlds extends (a: infer A) => void ? A : never; type IsUnion = [T] extends [UnionToIntersection] ? false : true; type UnionToArray = IsUnion extends true ? [...UnionToArray>>, PopUnion] : [T]; type Prettify = { [K in keyof T]: T[K]; } & {}; type ExtendedPrettify = T extends infer U ? Prettify : never; type NonEmptyArray = [T, ...Array]; export type { ExtendedPrettify, NonEmptyArray, Prettify, UnionToArray, UnionToIntersection };