在下面的代码片段中,我声明了一个curried add方法。
const add = (a: number) => {
return (b?: number) => {
return (b === undefined ? a : add(a + b))
}
}
如果我使用以下参数调用它,则可以很好地工作:add(1)()
但是当我像这样调用typescript时,它会抛出以下错误:add(1)(2)()
Cannot invoke an expression whose type lacks a call signature. Type 'number | ((b?: number) => number | ...)' has no compatible call signatures.
我需要添加什么才能启用此方法的类型化使用?
发布于 2019-05-31 03:18:50
我会用以下Add
类型来描述add()
的类型:
type Add = (a: number) => Add2;
type Add2 = ((b: number) => Add2) & (() => number);
Add
函数类型接受一个数字并返回一个Add2
。
Add2
函数类型是一个overloaded函数,它根据传入参数的数量和类型返回不同的类型。它也是自引用的:如果用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
好的,希望这会有帮助;祝你好运!
https://stackoverflow.com/questions/56384165
复制相似问题