在下面的代码片段中,我声明了一种咖喱添加方法。
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.
我需要添加什么才能启用此方法的类型化用法?
答案 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;
好的,希望能有所帮助;祝你好运!