proxy 可拦截 get/set 操作实现自动类型转换:get 中按 schema 或命名规则转换返回值,set 中标准化输入值,均通过 reflect 保持原型链与访问器正确性,并支持声明式 schema 和 bypass 机制。

可以通过 Proxy 拦截对象的 get 和 set 操作,在读取或赋值时自动完成类型转换,无需修改原始数据结构或手动调用转换函数。
拦截读取:自动转换返回值类型
在 get 拦截器中判断目标属性值和期望类型,对数字字符串、布尔字符串等常见情况做隐式转换。例如将 "123" 转为 123,"true" 转为 true,但需保留原始值不被污染。
- 使用
Reflect.get(target, prop, receiver)获取原始值 - 根据预设规则(如字段名后缀
Id、Count或配置映射表)决定是否转换 - 对字符串数字调用
Number(value),对布尔字符串用value === 'true'等安全判断 - 避免全局转换,仅对明确需要的字段生效,防止意外副作用
拦截写入:标准化输入值类型
在 set 拦截器中提前校验并转换传入值,确保内部存储格式统一。比如用户传入字符串 "42",自动存为数字 42;传入 0 或 false 时按业务规则归一化。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 先获取当前属性的预期类型(可通过 Symbol 元数据、schema 配置或命名约定推断)
- 对传入值做类型归一:字符串转数字、空字符串转
null、非标准布尔值转布尔 - 转换失败时可抛错或静默忽略,取决于健壮性要求
- 务必调用
Reflect.set(target, prop, convertedValue, receiver)写入转换后的值
结合 Reflect 保持原型链与 this 绑定
Proxy 中所有操作应优先委托给 Reflect API,而不是直接访问 target[prop]。这样能正确处理 getter/setter、继承属性和 this 上下文,避免代理失效或行为异常。
-
get和set必须接收第四个参数receiver并传给Reflect方法 - 若目标对象有访问器属性(accessor),直接读写会绕过其逻辑,必须用
Reflect触发 - 对数组索引、length 属性等特殊键,
Reflect行为更符合 ES 规范
类型转换策略建议
硬编码转换规则易维护性差,推荐用声明式方式管理类型映射。例如定义一个 schema 对象,标明哪些字段需转 number、boolean 或 Date,Proxy 根据该 schema 动态决策。
- schema 示例:
{ userId: 'number', isActive: 'boolean', createdAt: 'date' } - 日期字段可用
new Date(value),但需检查isNaN(date.getTime())排除无效输入 - 支持自定义转换函数,如
price: (v) => parseFloat(v).toFixed(2) - 提供 bypass 机制(如属性名以
$开头)跳过转换,兼顾灵活性










