我想用 TypeScript 编写如下代码
我将实现一个柯里化函数,其内部逻辑符合函数式编程中标准的柯里化概念。函数名为 curry
。请写出其完整的 TypeScript 函数签名。
以下是 curry
函数的 TypeScript 函数签名:
declare function curry<Args extends any[], Return>(
fn: (...args: Args) => Return
): (...args: Args) => Args extends [infer FirstArg, ...infer RestArgs]
? RestArgs extends any[]
? (arg: FirstArg) => curry<RestArgs, Return>
: never
: Return;
该函数接受一个函数作为参数,并返回一个新函数,新函数会对原函数进行柯里化。
柯里化后的函数会一直接受多个参数,每当传入一个参数时,就会返回一个新的函数,新函数接受剩余的参数,并继续等待下一个参数的传入。当传入的参数数量达到原函数的参数数量时,就会执行原函数并返回结果。
例如,对于一个接受两个参数的函数 add
,使用 curry
函数进行柯里化后的函数 addCurried
,可以这样调用:
const add = (a: number, b: number) => a + b;
const addCurried = curry(add);
const result = addCurried(1)(2); // result = 3