能否通过扩展现有typedef定义JSDoc对象类型?
在JSDoc中组合现有typedef创建新类型的正确方式
你尝试的@property {...One}写法不符合JSDoc语法规范,所以生成HTML文档时无法正确解析扩展效果。JSDoc本身支持通过类型交集的方式实现类似对象扩展的typedef组合,以下是具体可行方案:
方案1:使用类型交集语法(推荐)
JSDoc支持用&符号合并多个对象类型,直接创建包含所有属性的新typedef,这种方式在生成HTML文档时能正确展示合并后的全部属性:
/** * @typedef {Object} One * @property {string} name One类型的属性 * @property {number} age One类型的属性 */ /** * @typedef {Object} Two * @property {boolean} isActive Two类型的属性 * @property {string[]} tags Two类型的属性 */ /** * 合并One和Two所有属性的新类型 * @typedef {One & Two} Three */
生成HTML文档后,Three的属性列表会自动包含name、age、isActive、tags四个属性,和原生JS对象扩展的效果一致。
方案2:手动声明合并属性(兼容旧版JSDoc)
如果你的JSDoc版本不支持类型交集,也可以手动在新typedef中声明所有需要的属性,引用原有类型的属性定义:
/** * @typedef {Object} Three * @property {One['name']} name 继承自One的属性 * @property {One['age']} age 继承自One的属性 * @property {Two['isActive']} isActive 继承自Two的属性 * @property {Two['tags']} tags 继承自Two的属性 */
这种方式虽然繁琐,但兼容性更好,同样能在HTML文档中正确展示所有属性。
注意事项
- 如果合并的两个类型存在同名属性,
Three会以最后合并的类型属性为准(比如One和Two都有name属性,One & Two会保留Two的name属性定义) - 若需要重写某个属性,只需在
Three的typedef中单独声明该属性即可覆盖原有类型的定义
内容的提问来源于stack exchange,提问作者Fergie
相关产品推荐
相关产品推荐

