我将实现一个柯里化函数,其内部逻辑符合函数式编程中标准的柯里化概念。函数名为 `curry`。请写出其完整的 TypeScript 函数签名。

2023-04-21by@kiheha3247-G1a-X&@typescript.Model: gpt-3.5
kiheha3247-G1a-X

我想用 TypeScript 编写如下代码

Avatar
kiheha3247-G1a-X

我将实现一个柯里化函数,其内部逻辑符合函数式编程中标准的柯里化概念。函数名为 curry。请写出其完整的 TypeScript 函数签名。

Avatar
Avatar

以下是 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