如何在TypeScript中向咖喱函数添加类型?

时间:2019-05-30 19:00:58

标签: typescript currying

在下面的代码片段中,我声明了一种咖喱添加方法。

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.

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

1 个答案:

答案 0 :(得分:2)

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

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

Add函数类型采用数字并返回Add2

Add2函数类型是overloaded函数,它根据传入的参数的数量和类型返回不同的类型。它也是自引用的:如果调用{{1} }和一个Add2参数,您将得到一个number

您或多或少需要使用assertions来使编译器确信您的Add2是有效的add()

Add

然后您应该能够按预期使用它:

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

Link to code

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