joobang/type-challenges

no - 3196 - Flip Arguments

Closed this issue · 0 comments

type Reverse<T extends any[], U extends any[] = []> = T extends [infer F, ...infer R] 
                                  ? Reverse<[...R], [F, ...U]>
                                  : U;
type FlipArguments<T extends (...args: any) => any> = T extends (...args: infer P) => infer U 
                                                        ? (...args: Reverse<P>) => U
                                                        : never;
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'


type test = FlipArguments<(arg0: string, arg1: number, arg2: boolean) => void>;
type cases = [
  Expect<Equal<FlipArguments<() => boolean>, () => boolean>>,
  Expect<Equal<FlipArguments<(foo: string) => number>, (foo: string) => number>>,
  Expect<Equal<FlipArguments<(arg0: string, arg1: number, arg2: boolean) => void>, (arg0: boolean, arg1: number, arg2: string) => void>>,
]

type errors = [
  // @ts-expect-error
  FlipArguments<'string'>,
  // @ts-expect-error
  FlipArguments<{ key: 'value' }>,
  // @ts-expect-error
  FlipArguments<['apple', 'banana', 100, { a: 1 }]>,
  // @ts-expect-error
  FlipArguments<null | undefined>,
]