typescript - 如何使用回调函数和结果使用 TypeScript 实现无限柯里求和值?

标签 typescript currying

如何在 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/

相关文章:

c++ - Boost Lambda/Phoenix - 如何做返回另一个 lambda 的 lambda?

haskell - 需要帮助理解类型(基于 curry)

ios - 组合两种不同的函数定义 - 一种柯里化(Currying),一种标准

angular - 将对象的部分属性中的值分配给该对象会导致类型错误

typescript - karma , typescript 定义文件未加载

typescript - Eslint 'rxjs/operators' 应该在项目的依赖项中列出

typescript - http-loader 无法包含来自另一个项目的 html

javascript - typescript :合并/覆盖嵌套接口(interface)

swift - Swift 中偏函数应用的有用示例是什么?

参数数量可变的 Python 柯里化(Currying)函数