如何更优地为生成用户对象的函数设置默认参数
更简洁的用户对象生成方案
你不需要逐个声明参数和返回属性,利用对象展开运算符就能大幅简化代码,同时保留自定义覆盖默认值的能力,完美解决30个属性带来的繁琐维护问题。
基础优化版本
直接通过对象合并实现,让传入的自定义属性自动覆盖默认对象的同名键:
const defaultUser = { id: 'test_id', last_time: '17:59:00', slide_id: 'slide ID', name: 'AA1', address: 'blabala', number_of_houses: 500, age: 20, active: false, children: { boy: [], girl: [] }, }; const generateUser = (customProps = {}) => { // 先展开默认对象,再用自定义属性覆盖同名属性 return { ...defaultUser, ...customProps }; }; // 使用示例 const user = generateUser(); // 完全使用默认值生成用户 const secondUser = generateUser({ name: 'test_2' }); // 仅覆盖name属性
这个写法的核心优势:
- 新增/删除默认属性时,只需要修改
defaultUser对象,无需改动函数参数和返回值 - 自定义属性自动覆盖默认值,逻辑直观易懂
- 代码量骤减,彻底告别冗长的参数列表
处理嵌套对象的深拷贝问题
如果默认对象包含嵌套结构(比如children),上面的浅拷贝会导致修改嵌套属性时污染原defaultUser。比如直接修改生成用户的children.boy,会连带改变默认对象的对应属性。此时需要用深合并来避免引用共享:
const generateUser = (customProps = {}) => { // 递归实现深合并,确保嵌套对象完全独立 const deepMerge = (target, source) => { const merged = { ...target }; for (const key in source) { if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) { merged[key] = deepMerge(target[key], source[key]); } else { merged[key] = source[key]; } } return merged; }; return deepMerge(defaultUser, customProps); }; // 测试:修改生成用户的嵌套属性不会污染默认对象 const fourthUser = generateUser(); fourthUser.children.boy.push('小红'); console.log(defaultUser.children.boy); // 输出空数组,不受影响
额外优化:TypeScript类型提示(可选)
如果是TypeScript项目,可以给默认对象定义类型,让生成函数获得精准的属性提示,避免拼写错误:
type User = typeof defaultUser; const defaultUser: User = { // 同默认对象结构 }; const generateUser = (customProps?: Partial<User>): User => { return { ...defaultUser, ...customProps }; };
内容的提问来源于stack exchange,提问作者aviv.L
相关产品推荐
相关产品推荐

