Flip Arguments

Challenge

Implement the type version of lodash’s _.flip.

Type FlipArguments<T> requires function type T and returns a new function type which has the same return type of T but reversed parameters.

For example:

type Flipped = FlipArguments<
  (arg0: string, arg1: number, arg2: boolean) => void
>;
// (arg0: boolean, arg1: number, arg2: string) => void

Solution

Um dieses Problem zu lösen, können wir einen Hilfstypen anlegen, der erstmal einfach nur einen Array entgegennimmt und diesen umdreht. Hierdurch können wir den finalen Typen einfacher schreiben.

type Reverse<T extends unknown[]> = T extends [infer H, ...infer Rest]
  ? [...Reverse<Rest>, H]
  : T;

Nun müssen wir nur noch die Argumente der Funktion extrahieren, dies kann man z.B. über ein infer erreichen, alternativ steht auch der von TypeScript mitgelieferte Typ Parameters<T> bereit.

type FlipArguments<T extends (...args: any[]) => any> = T extends (
  ...args: infer U
) => infer R
  ? (...args: [...Reverse<U>]) => R
  : never;

References