Dinero.js能否全局开启严格货币格式校验或自动格式化货币?
Dinero.js 货币代码大小写不统一问题处理方案
Dinero.js 原生没有提供全局自动转换货币码大小写、非法货币码提前抛错的内置配置项,但是可以通过官方推荐的统一入口封装方式,实现全局层面的货币格式统一,不需要逐行修改存量业务代码。
可落地方案
1. 封装全局公共Dinero构造函数
不要在业务代码中直接引入原生Dinero构造方法,单独维护一个公共工具文件导出封装后的Dinero方法,所有业务逻辑统一从该文件引入调用,在封装层统一处理货币码逻辑:
// src/common/dinero.js import { Dinero as BaseDinero } from 'dinero.js'; import { USD, CNY, EUR } from '@dinero.js/currencies'; // 维护项目支持的标准ISO 4217大写货币码白名单 const VALID_CURRENCIES = { USD, CNY, EUR }; export const Dinero = (options) => { // 自动将传入的货币码转为大写,兼容小写传参 const normalizedCurrencyCode = options.currency.toString().toUpperCase(); // 传入非法货币码时提前抛出明确错误,不用等到运算阶段才报模糊的同币种校验错误 if (!Object.keys(VALID_CURRENCIES).includes(normalizedCurrencyCode)) { throw new Error(`非法货币代码:${options.currency},请使用标准ISO 4217货币格式`); } // 传入标准化参数生成原生Dinero实例 return BaseDinero({ ...options, currency: VALID_CURRENCIES[normalizedCurrencyCode] }); };
封装后不管传入'usd'还是'USD',都会被统一转换为标准大写的USD货币配置,不会再出现同币种因大小写差异被识别为不同货币、触发You must provide a Dinero instance with the same currency报错的问题。
2. TypeScript项目补充类型拦截
如果项目使用TypeScript,可以在封装的基础上补充类型定义,在编码阶段就提示不规范的传参:
type StandardCurrencyCode = keyof typeof VALID_CURRENCIES; interface CustomDineroOptions { amount: number; currency: StandardCurrencyCode | Lowercase<StandardCurrencyCode>; scale?: number; } export const Dinero = (options: CustomDineroOptions) => { // 运行时处理逻辑和上面保持一致 };
如果是使用v1版本Dinero.js,处理逻辑完全一致,只需要在封装层把传入的currency字符串执行toUpperCase()后再传给原生构造函数即可。
内容的提问来源于stack exchange,提问作者Igor Loskutov
相关产品推荐
相关产品推荐

