// oh boy don't do this type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( k: infer I, ) => void ? I : never; type LastOf = UnionToIntersection< T extends any ? () => T : never > extends () => infer R ? R : never; // TS4.0+ type Push = [...T, V]; // TS4.1+ export type TuplifyUnion< T, L = LastOf, N = [T] extends [never] ? true : false > = true extends N ? [] : Push>, L>;