函数式compose和pipe学习

将一堆函数,合并在一起执行,上一次函数的结果,作为下一个函数的参数。

/**
 * 泛型约束
 */
interface DigitInterface<T> {
	(v: T): T;
}

/**
 * 保留几位小数
 */
export const currykeepMuchDecimal = (decimal: number) => {
	return <DigitInterface>(v: number) => {
		return Math.round(v * decimal) / decimal;
	}
};
/**
 * 将string类型转换成数字类型
 */
export const toNumber = (v: string): number => parseFloat(v);

/**
 * 计算倍数
 */
export const curryMultiple = (multiple: number) => {
	return <DigitInterface>(v: number) => {
		return v * multiple
	}
};
/**
 * compose 函数
 */
export const compose = (...fns: any) => {
	if (fns.length === 0) return (arg: any) => arg;
	if (fns.length === 1) return fns[0];
	/**
	 * 巧妙利用reduce的一直拼接特性 函数从右到左执行 右边的函数结果做完参数传递下去
	 * 返回一个无限包裹的函数(x)=> a(b(c(c(d(x)))))
	 */
	return fns.reduce((a: any, b: any) => (...args: any) => a(b(...args)))
};
/**
 * pie 函数
 * 和compose 执行顺序相反
 */
export const pipe = (...fns: any) => {
	if (fns.length === 0) return (arg: any) => arg;
	if (fns.length === 1) return fns[0];
	/**
	 * 巧妙利用reduce的一直拼接特性 从左到右执行
	 * 返回一个无限包裹的函数(x)=> d(c(b(a(x))))
	 */
	return fns.reduce((a: any, b: any) => (...args: any) => b(a(...args)))
};
/**
 * 字符串百分比转换
 */
export const strTransformPercentage = compose(currykeepMuchDecimal(100), curryMultiple(100), toNumber);
/**
 * num百分比转换
 */
export const numTransformPercentage = compose(currykeepMuchDecimal(100), curryMultiple(100));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值