calc_wrap
calc_wrap 是 calc 的增强版本,支持柯里化调用和预配置。
基本签名
typescript
function calc_wrap<Expr, Fmt, Err, Options>(
exprOrOptions: Expr | Options,
optionsOrExpr?: Options | Expr
): string | number | Err | ((arg: any) => string | number | Err)特点
- 支持表达式优先或数据优先的调用方式
- 支持柯里化(部分应用)
- 默认
_error: '-'(不会抛出异常) - 灵活的参数顺序
使用方式
方式一:直接调用
javascript
import { calc_wrap } from 'a-calc'
// 与 calc 类似
calc_wrap('1 + 2') // '3'
calc_wrap('a + b', { a: 1, b: 2 }) // '3'方式二:表达式优先(柯里化)
先传表达式,返回一个接收数据的函数:
javascript
const addAB = calc_wrap('a + b')
addAB({ a: 1, b: 2 }) // '3'
addAB({ a: 10, b: 20 }) // '30'
// 带格式化
const calcPrice = calc_wrap('price * qty | =2,')
calcPrice({ price: 99.9, qty: 1 }) // '99.90'
calcPrice({ price: 99.9, qty: 2 }) // '199.80'方式三:数据优先(柯里化)
先传数据,返回一个接收表达式的函数:
javascript
const withData = calc_wrap({ a: 10, b: 20 })
withData('a + b') // '30'
withData('a * b') // '200'
withData('a - b') // '-10'方式四:预配置
创建带有预设配置的计算函数:
javascript
// 创建预配置的计算函数
const calcMoney = calc_wrap({
_fmt: '=2,',
_unit: true,
_error: '-'
})
calcMoney('100元 + 50元') // '150.00元'
calcMoney('price * qty', { price: '99元', qty: 3 }) // '297.00元'与 calc 的区别
| 特性 | calc | calc_wrap |
|---|---|---|
| 错误处理 | 抛异常 | 默认返回 '-' |
| 柯里化 | ❌ | ✅ |
| 参数顺序 | 固定 | 灵活 |
| 预配置 | ❌ | ✅ |
实际应用
表格数据处理
javascript
import { calc_wrap } from 'a-calc'
const data = [
{ price: 10, qty: 2 },
{ price: 20, qty: 3 },
{ price: 15, qty: 1 }
]
// 创建计算函数
const calcTotal = calc_wrap('price * qty | =2')
// 映射计算
const totals = data.map(item => calcTotal(item))
// ['20.00', '60.00', '15.00']Vue/React 中使用
javascript
// Vue 示例
import { calc_wrap } from 'a-calc'
// 创建格式化金额的计算函数
const formatMoney = calc_wrap({ _fmt: '=2,' })
export default {
computed: {
formattedPrice() {
return formatMoney(this.price)
},
totalAmount() {
return formatMoney('price * quantity', {
price: this.price,
quantity: this.quantity
})
}
}
}复用计算逻辑
javascript
import { calc_wrap } from 'a-calc'
// 定义业务计算函数
const calcDiscount = calc_wrap('original * (1 - rate) | ~5=2')
const calcTax = calc_wrap('amount * taxRate | ~5=2')
const calcFinal = calc_wrap('subtotal + tax | =2,')
// 使用
const discounted = calcDiscount({ original: 100, rate: 0.2 }) // '80.00'
const tax = calcTax({ amount: 80, taxRate: 0.1 }) // '8.00'
const final = calcFinal({ subtotal: 80, tax: 8 }) // '88.00'Ctrl+D 选择词, Ctrl+/ 注释