Flip Arguments
Завдання
Реалізуйте типізовану версію lodash _.flip
.
Тип FlipArguments<T>
приймає тип функції T
і повертає новий тип функції,
який має той самий тип повернення, але параметри в зворотньому порядку.
Наприклад:
type Flipped = FlipArguments<
(arg0: string, arg1: number, arg2: boolean) => void
>;
// (arg0: boolean, arg1: number, arg2: string) => void
Розв’язок
Рішення цієї проблеми дуже просте. Перевіряємо, чи тип T
є типом функції, і
якщо так, то змінюємо порядок аргументів.
type FlipArguments<T> = T extends (...args: [...infer P]) => infer R
? never
: never;
Захопивши аргументи функції в P
і її тип повернення в R
, давайте змінимо
порядок аргументів та повернемо те ж саме з нашого виразу вище.
type MyReverse<T extends unknown[]> = T extends [...infer F, infer S]
? [S, ...MyReverse<F>]
: [];
type FlipArguments<T> = T extends (...args: [...infer P]) => infer R
? (...args: MyReverse<P>) => R
: never;
Коментарі