如何向 TypeScript 中的柯里化函数添加类型?

How to add types to a curried function in TypeScript?

在下面的代码片段中,我声明了一个 curried add 方法。

const add = (a: number) => {
  return (b?: number) => {
    return (b === undefined ? a : add(a + b))
  }
}

如果我使用以下参数调用它,它就可以正常工作: add(1)()

但是当我这样调用它时,打字稿会抛出以下错误: add(1)(2)()

Cannot invoke an expression whose type lacks a call signature. Type 'number | ((b?: number) => number | ...)' has no compatible call signatures.

我需要添加什么才能启用此方法的类型化用法?

我会将 add() 的类型描述为以下 Add 类型:

type Add = (a: number) => Add2;
type Add2 = ((b: number) => Add2) & (() => number);

Add 函数类型接受一个数字和 returns 一个 Add2

Add2 函数类型是一个 overloaded 函数,它 returns 是一种不同的类型,具体取决于传入参数的数量和类型。它也是 self-referential:如果你用 number 参数调用 Add2,你会得到一个 Add2

您或多或少需要使用 assertions 让编译器相信您的 add() 是有效的 Add:

const add = ((a: number) => (b?: number) =>
  b === undefined ? a : add(a + b)) as Add;

然后你应该可以按预期使用它了:

const x = add(1)(2)(3)(); // number
console.log(x); // 6

Link to code

好的,希望对你有帮助;祝你好运!