问题 #
实现 lodash
里的 _.flip
函数的类型推断
类型 FlipArguments<T>
接受一个函数类型的泛型 T
返回一个新函数类型,和传入的函数有一样的返回类型,但是参数需要颠倒过来。
例如:
type case1 = FlipArguments<() => boolean> // () => boolean
type case1 = FlipArguments<(foo: string) => number> // (foo: string) => number
type case1 = FlipArguments<(arg0: string, arg1: number, arg2: boolean) => void> // (arg0: boolean, arg1: number, arg2: string) => void
解答 #
type Reverse<T> = T extends [...infer Rest, infer L] ? [L, ...Reverse<Rest>] : T
type FlipArguments<T extends Function> = T extends (...args: infer P) => infer R ? (...args: Reverse<P>) => R: never
拆分 #
- 利用
infer
获取函数的返回值和参数 - 利用 Reverse 写好的数组颠倒函数把参数颠倒