17 - 柯里化 1
在此挑战中建议使用TypeScript 4.0
柯里化 是一种将带有多个参数的函数转换为每个带有一个参数的函数序列的技术。
例如:
const add = (a: number, b: number) => a + b
const three = add(1, 2)
const curriedAdd = Currying(add)
const five = curriedAdd(2)(3)
传递给 Currying
的函数可能有多个参数,您需要正确输入它的类型。
在此挑战中,柯里化后的函数每次仅接受一个参数。接受完所有参数后,它应返回其结果。
Solution
declare function Currying<F>(fn: F): Curried<F>
type Curried<F> = F extends (...args: infer A) => infer R
? A extends [infer First, ...infer Other]
? (
arg: First
) => Other['length'] extends 0 ? R : Curried<(...args: Other) => R>
: () => R
: never