如何向 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
好的,希望对你有帮助;祝你好运!
在下面的代码片段中,我声明了一个 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
好的,希望对你有帮助;祝你好运!