Flip Arguments
挑战
在类型系统中实现 Lodash 的 _.flip
方法。
类型 FlipArguments<T>
需接收函数类型 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
。接下来我们翻转参数,并保持最终的函数返回类型为 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;
评论