type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
type ExtractLast<T> = UnionToIntersection<T extends T ? T[] : never> extends (infer L)[] ? L : never;
type UnionToTuple<T, L = ExtractLast<T>> = [T] extends [L] ? [T] : [...UnionToTuple<Exclude<T, L>>, L]
type Union = 'a' | 'b' | 'c' | 'd'
type Tuple = UnionToTuple<Union> // ["a", "b", "c", "d"]