typescript中的curry(柯里化)学习笔记

ts中的curry :柯里化,实际上就是把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,如果其他的参数是必要的,返回接收余下的参数且返回结果。

第一个例子:实现加法的柯里化

/*
前端使用柯里化的用途主要是简化代码结构,提高系统的维护性,一个
方法,只有一个参数,强调了功能的单一性,很自然就做到了功能内聚,
降低耦合
优点:降低代码的重复,提高代码的适应性
*/



var Add = (x:number, y:number) => {
          
   
    return x+y;
}


//参数个数的优化
var curry = (fun) => {
          
   
    return function(firstArg){
          
   
        return function(secondArg){
          
   
            return fun(firstArg,secondArg);
        };
    };
};

const autoCurriedAdd = curry(Add);

//接收够被柯里化函数的参数数量时触发执行。
var res = autoCurriedAdd(1)(1);
console.log(tag, res)

上面的例子是接收两个参数,那如果有很多的参数呢???所以我们需要进阶版curry. 第二个例子:

//柯里化函数
const Curry = (fn) => {
          
   
    //... 表示有1个或者更多的参数
    return function curriedFn(...args){
          
   
        //检查传入的参数args的数目是否小于函数fn的参数的个数
        if(fn.length > args.length){
          
   
            //如果传入的参数个数不够,返回一个函数,并传入上一次的参数
            return function(){
          
   
                //重新返回调用curriedFn
                return curriedFn.apply(
                    //concat,连接两个或更多的数组,在args后面追加arguments的内容,arguments表示之前传入的参数
                    null,args.concat([].slice.call(arguments))
                );
            }
        }
        //如果参数符合要求,将所有的参数传入fn函数内部
        return fn.apply(null,args);
    }
}

const multiply = (x, y, z) => x*y*z
const curryMul = Curry(multiply);   //调用Curry函数,返回curriedFn函数
const result = curryMul(1)(2)(3);
console.log(res, result)

上面的这个复杂Curry就是可以接收多个参数,根据传入的函数fn所需要的参数个数进行动态执行。效果就是实现multiply的效果。

经验分享 程序员 微信小程序 职场和发展