简单手写 curry 柯里化

Huy小于 1 分钟javascriptjavascript

/**
 * 手写柯里化
 */

function curry(fn: Function) {
  // 获取传入函数的参数长度
  const fnArrayLength = fn.length
  let args: any[] = []

  // 在 ts 中, 独立的函数的 this 要声明类型
  function calc(this: any, ...newArgs: any[]) {
    // 积累参数
    args = [...args, ...newArgs]

    if (args.length < fnArrayLength) {
      // 参数不够, 返回函数
      return calc
    } else {
      // 参数够了, 返回执行结果
      return fn.apply(this, args.slice(0, fnArrayLength)) // 参数进行截断, 防止参数过多
    }
  }
  return calc
}

function add(a: number, b: number, c: number): number {
  return a + b + c
}

const res = curry(add)
console.info(res(1)(2)(3))
Loading...