如何用TypeScript实现带回调的无限柯里化求和及声明类型?
TypeScript实现无限柯里化求和及类型声明
需求说明
需要实现一个支持无限柯里化的求和函数sum,满足以下调用规则:
- 传入任意数量数字参数时,返回可继续调用的函数
- 不带参数调用时,返回当前所有传入数字的总和
- 直接调用
sum()返回0
正确的TypeScript实现及类型声明
首先定义递归的函数类型,用来描述柯里化的求和函数:
type CurriedSum = ((...args: number[]) => CurriedSum) & { (): number };
然后修改原JavaScript代码,替换any为正确的类型:
const sum: CurriedSum = function sum(...allNumbers: number[]): CurriedSum | number { if (allNumbers.length === 0) return 0; const sumValue = (numbers: number[]) => numbers.reduce((sum, num) => sum + num, 0); return function memoFunc(...nums: number[]): CurriedSum | number { allNumbers = allNumbers.concat(nums); if (nums.length === 0) { return sumValue(allNumbers); } return memoFunc as CurriedSum; }; };
类型解释
CurriedSum是交叉类型:既表示接收任意数量number参数并返回自身的函数,也表示不带参数时返回number的函数,让TypeScript能正确推断不同调用场景的返回值。- 实现中
memoFunc需要用as CurriedSum断言类型,因为TypeScript无法自动推导递归函数的类型。 - 所有参数都限制为
number类型,避免any带来的类型不安全问题。
测试验证
console.log(sum(100, 200)(300)()); // 输出 600 console.log(sum(100, 200)()); // 输出 300 console.log(sum()); // 输出 0
内容的提问来源于stack exchange,提问作者Godfery Young
相关产品推荐
相关产品推荐

