You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过扩展现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:41:03