如何在 typescript 中声明柯里求和函数类型?
我需要一个 sum
函数,它可以通过像这样的柯里化(Currying)来求和数字
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
我可以用javascript实现,但我不知道如何在 typescript 中声明类型
const sum = function sum(...allNumbers: any[]):any {
if (allNumbers.length === 0) return 0;
const sumValue = (numbers: number[]) =>
numbers.reduce((sum, num) => (sum += num), 0);
return function memoFunc(...nums: any[]): any {
allNumbers = allNumbers.concat(nums);
if (nums.length === 0) {
return sumValue(allNumbers);
}
return memoFunc;
};
}
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
这是我的代码,我不知道如何声明类型,所以我使用 any
来替换。
我怎样才能删除它?
最佳答案
// It's easier to use a `type` as it's recursive
type ChainedAdd = ((...numbers: number[]) => ChainedAdd) & (() => number)
function chainedAdd(base: number): ChainedAdd {
// the below definition is overloading definition of ChainedAdd
function add(): number;
function add(...numbers: number[]): ChainedAdd;
function add(...numbers: number[]) {
if (numbers.length > 0) {
// this is sum reducer, replace with whatever you like
let newBase = numbers.reduce((v, e) => v + e, base);
return chainedAdd(newBase);
} else {
return base;
}
}
return add
}
const sum = chainedAdd(0);
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
关于typescript - 如何使用回调函数和结果使用 TypeScript 实现无限柯里求和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74217785/