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的效果。