You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:25:16