type Reverse<T> = T extends [...infer L, infer R] ? [R, ...Reverse<L>] : [];
type FlipArguments<T> = T extends (...args: infer A) => infer R
? (...args: Reverse<A>) => R
: never;
type Flipped = FlipArguments<(a: string, b: number, c: boolean) => string>;
// type Flipped = (args_0: boolean, args_1: number, args_2: string) => string
반환값과 매개변수의 타입을 추론한 뒤, 매개변수에 Reverse 타입을 적용했습니다. A는 이미 매개변수의 튜플인 상태라 바로 Reverse 타입을 적용할 수 있습니다.