Так как порядок в юнион не определен, можно получить лишь юнион всех возможных вариантов:
type Char = "A" | "B" | "C" | "D";
type ConcatMap<T> = T extends unknown
? {} extends T[keyof T]
? `${string & keyof T}`
: `${string & keyof T}${ConcatMap<T[keyof T]>}`
: never;
type MapChars<C extends Char> = {
[K in C]: MapChars<Exclude<C, K>>
};
type Split<S extends string> = S extends `${infer H}${infer Tail}`
? [H, ...Split<Tail>]
: [];
type T1 = Split<T2>;
type T2 = ConcatMap<MapChars<Char>>;
https://www.typescriptlang.org/play?#code/C4TwDgpg...