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

如何使用JsDoc正确为Vue中Object/Array类型的props编写文档?

Vue Object/Array类型Props的JSDoc注释规范(适配vue-styleguidist)

以下写法完全符合vue-styleguidist的解析标准,无需TypeScript即可自动生成带完整字段说明的组件文档:

1. Object类型Props注释

两种写法都支持,按需选择:

写法1:单独定义类型(推荐,可复用)

先通过@typedef定义对象的完整结构,再在props注释中引用类型:

/**
 * Foo配置对象结构定义
 * @typedef {Object} FooConfig
 * @property {string} mandatoryItem1 - 必填字符串字段,说明具体用途
 * @property {Object} mandatoryItem2 - 必填嵌套对象
 * @property {boolean} mandatoryItem2.mayBeEvenNested - 嵌套布尔类型必填字段
 * @property {string} [optionalItem1] - 可选字符串字段,非必填项用[]包裹
 * @property {number} [optionalItem2=0] - 有默认值的可选数字字段
 */

export default {
  props: {
    /**
     * 组件核心配置参数
     * @type {FooConfig}
     */
    foo: {
      type: Object,
      required: true
    }
  }
}

写法2:直接嵌套写属性(适合简单一次性结构)

不需要单独抽类型,直接在props的注释里写字段说明:

export default {
  props: {
    /**
     * 组件核心配置参数
     * @type {Object}
     * @property {string} mandatoryItem1 - 必填字符串字段,说明具体用途
     * @property {Object} mandatoryItem2 - 必填嵌套对象
     * @property {boolean} mandatoryItem2.mayBeEvenNested - 嵌套布尔类型必填字段
     * @property {string} [optionalItem1] - 可选字符串字段
     */
    foo: {
      type: Object,
      required: true
    }
  }
}

2. Array类型Props注释

先定义数组元素的结构,再指定props类型为对应类型的数组即可:

/**
 * 数组元素结构定义
 * @typedef {Object} ListItem
 * @property {number} id - 唯一标识,必填
 * @property {string} label - 展示文本,必填
 * @property {boolean} [disabled=false] - 是否禁用,可选,默认false
 */

export default {
  props: {
    /**
     * 渲染用列表数据
     * @type {ListItem[]}
     */
    list: {
      type: Array,
      required: true,
      // 可搭配validator做运行时结构校验
      validator: (val) => val.every(item => item.id && item.label)
    }
  }
}

注意事项

  • 可选字段统一用方括号包裹属性名,vue-styleguidist会自动标记为非必填
  • 字段默认值可在属性名后加=默认值标注
  • 以上所有写法都会被vue-styleguidist正确识别,自动生成的文档会完整展示嵌套层级、字段必填状态、类型说明

内容的提问来源于stack exchange,提问作者Hendrik Schmitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:24:01