TypeScript中使用PropertyPath调用Lodash set方法无法更新属性
解决Lodash PropertyPath路径更新不生效的问题
核心排查方向与修复方案
你用数组形式的['epic', 'reprint', 'enabled']作为PropertyPath是符合Lodash规范的,问题大概率出在以下几个环节:
确认目标配置对象是否正确
你的setConfig函数必须确保传入Lodashset方法的第一个参数是gaming服务对应的配置对象,而非整个全局配置集合。比如如果你的全局配置结构是:const globalConfigs = { gaming: { epic: { reprint: { enabled: false } } } };那setConfig里必须先拿到
globalConfigs.gaming再调用_.set,而不是直接传globalConfigs。检查set方法的调用参数顺序
Lodashset的语法是_.set(targetObject, path, value),务必确认你的函数里参数顺序没有搞反——比如不要写成_.set(path, targetObject, value),这是最容易犯的低级错误。验证配置对象的可修改性
如果目标配置对象被Object.freeze()或者设置为只读,Lodash的set方法会静默失败,不会抛出错误。可以在调用set前后打印对象,确认是否有修改权限。
正确的代码实现示例
import _ from 'lodash'; // 复用你提到的类型定义 type PropertyName = string | number | symbol; type Many<T> = T | T[]; type PropertyPath = Many<PropertyName>; // 模拟你的配置结构 const serviceConfigs = { gaming: { epic: { reprint: { enabled: false } } } }; function setConfig(service: string, path: PropertyPath, value: unknown) { // 先定位到目标服务的配置 const targetConfig = serviceConfigs[service]; if (!targetConfig) { console.error(`找不到服务${service}的配置`); return; } // 正确调用Lodash set方法 _.set(targetConfig, path, value); } // 调用测试 setConfig('gaming', ['epic', 'reprint', 'enabled'], true); console.log(serviceConfigs.gaming.epic.reprint.enabled); // 输出true
额外排查点
- 确认调用setConfig时传入的
service参数是准确的'gaming',没有拼写错误(比如写成'game')。 - 如果是TypeScript项目,确保自定义的
PropertyPath类型和Lodash官方的PropertyPath类型完全兼容——可以直接导入Lodash的类型import type { PropertyPath } from 'lodash',避免自定义类型导致的隐性问题。
内容的提问来源于stack exchange,提问作者BruceyBandit
相关产品推荐
相关产品推荐

