JavaScript深度合并配置后如何保留VSCode自动补全功能?
问题:深度合并配置后VSCode无类型提示/自动补全
我正在开发一个极简配置系统,包含两个文件:
config.template.js:基础配置模板,包含所有默认配置项config.custom.js:用户自定义配置,仅覆盖需要修改的项
规则是custom中的配置值覆盖template对应值,缺失值从template读取。我实现了深度合并函数来完成这个逻辑,但VSCode无法识别合并后config的结构,没有自动补全和类型提示。
如果用浅拷贝的扩展运算符({...template, ...custom})能获得正常的自动补全,但这种方式会直接覆盖嵌套对象/数组,不符合需求。我尝试给deepMerge添加JSDoc注解,但没有效果,想知道如何不依赖浅拷贝实现自动补全和类型提示。
已解决:修正JSDoc注解实现类型提示
参考@creepsore的回答修改JSDoc注解后,解决了重载错误问题,以下是修改后的实现代码:
/** * 深度合并两个对象,custom中的值覆盖template对应值 * @template T * @template U * @param {T} template - 基础模板对象 * @param {U} custom - 自定义配置对象 * @returns {Merge<T, U>} 合并后的配置对象 */ function deepMerge(template, custom) { if (typeof template !== 'object' || template === null) { return custom !== undefined ? custom : template; } if (typeof custom !== 'object' || custom === null) { return template; } const merged = { ...template }; for (const key in custom) { if (Object.prototype.hasOwnProperty.call(custom, key)) { merged[key] = deepMerge(template[key], custom[key]); } } return merged; } /** * 辅助类型:合并两个对象类型,U的属性覆盖T的属性 * @template T * @template U * @typedef {Omit<T, keyof U> & U} Merge */ // 使用示例 import template from './config.template.js'; import custom from './config.custom.js'; const config = deepMerge(template, custom); // 现在VSCode能识别config的完整类型并提供自动补全
内容的提问来源于stack exchange,提问作者NullDev
相关产品推荐
相关产品推荐

