JSDoc 最新语法详细指南

目录

  1. JSDoc 简介
  2. 基本语法
  3. 最新特性
  4. 标签详解
  5. 最佳实践
  6. 参考资料

JSDoc 简介

JSDoc 是一种用于 JavaScript 的文档生成工具,通过在代码中添加特定格式的注释,自动生成 API 文档。以下是一个简单的简介示例:

/**
 * 一个简单的问候函数。
 * @param {string} name - 用户姓名
 * @returns {string} 问候语
 */
function sayHello(name) {
  return `Hello, ${name}!`;
}

基本语法

JSDoc 注释以 /** 开头,以 */ 结尾,通常用于描述函数、类、变量等代码元素。以下是多个示例,展示基本语法的不同应用场景。

示例 1:为简单函数添加注释

/**
 * 计算两数之和。
 * @param {number} x - 第一个数
 * @param {number} y - 第二个数
 * @returns {number} 两数之和
 */
function sum(x, y) {
  return x + y;
}

示例 2:为具有默认参数的函数添加注释

/**
 * 生成问候语。
 * @param {string} name - 用户姓名
 * @param {string} [greeting="Hello"] - 问候词,默认为 "Hello"
 * @returns {string} 完整的问候语
 */
function greet(name, greeting = "Hello") {
  return `${greeting}, ${name}!`;
}

示例 3:为类添加注释

/**
 * 表示一个矩形。
 * @class
 */
class Rectangle {
  /**
   * 创建一个矩形。
   * @param {number} width - 宽度
   * @param {number} height - 高度
   */
  constructor(width, height) {
    this.width = width;
    this.height = height;
  }

  /**
   * 计算矩形面积。
   * @returns {number} 面积
   */
  getArea() {
    return this.width * this.height;
  }
}

示例 4:为变量添加注释

/**
 * 当前用户的详细信息。
 * @type {Object}
 * @property {string} username - 用户名
 * @property {number} id - 用户ID
 */
const currentUser = {
  username: "Alice",
  id: 123,
};

示例 5:为常量添加注释

/**
 * 应用程序的最大连接数。
 * @type {number}
 */
const MAX_CONNECTIONS = 100;

最新特性

JSDoc 4.0.4 引入了对 ES6+ 语法、改进的类型系统和新增标签的支持。以下是每个特性的详细示例。

1. 对 ES6+ 语法的支持

JSDoc 4.0.4 更好地支持现代 JavaScript 特性,如箭头函数、解构赋值和模块。

示例 1:箭头函数

/**
 * 将数字乘以 3。
 * @param {number} value - 输入值
 * @returns {number} 三倍值
 */
const triple = (value) => value * 3;

示例 2:解构赋值参数

/**
 * 打印书籍信息。
 * @param {Object} book - 书籍对象
 * @param {string} book.title - 书籍标题
 * @param {number} book.year - 出版年份
 */
function printBook({ title, year }) {
  console.log(`${title} was published in ${year}`);
}

示例 3:ES6 模块导出

/**
 * 计算两数之积。
 * @param {number} a - 第一个数
 * @param {number} b - 第二个数
 * @returns {number} 乘积
 */
export function multiply(a, b) {
  return a * b;
}

2. 改进的类型系统

支持联合类型、交叉类型和泛型等高级类型。

示例 1:联合类型

/**
 * 检查值是否为有效输入。
 * @param {string | number} input - 输入值,可以是字符串或数字
 * @returns {boolean} 是否有效
 */
function validateInput(input) {
  return input !== null && input !== undefined;
}

示例 2:交叉类型

/**
 * @typedef {Object} Position
 * @property {number} x - X 坐标
 * @property {number} y - Y 坐标
 */

/**
 * @typedef {Object} Color
 * @property {string} color - 颜色值
 */

/**
 * 表示一个有颜色和位置的点。
 * @type {Position & Color}
 */
const coloredPoint = {
  x: 10,
  y: 20,
  color: "red",
};

示例 3:泛型

/**
 * 一个通用的容器类。
 * @template T
 */
class Container {
  /**
   * @param {T} item - 容器中的项
   */
  constructor(item) {
    this.item = item;
  }

  /**
   * 获取容器中的项。
   * @returns {T} 容器中的项
   */
  getItem() {
    return this.item;
  }
}

// 使用示例
const stringContainer = new Container("Hello");
const numberContainer = new Container(42);

3. 新的标签

新增 @async@generator 等标签。

示例 1:异步函数

/**
 * 从服务器获取用户数据。
 * @async
 * @param {string} userId - 用户ID
 * @returns {Promise<Object>} 用户数据
 */
async function fetchUser(userId) {
  const response = await fetch(`/api/users/${userId}`);
  return response.json();
}

示例 2:生成器函数

/**
 * 生成斐波那契数列。
 * @generator
 * @yields {number} 下一个斐波那契数
 */
function* fibonacci() {
  let a = 0,
    b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

标签详解

以下是常用 JSDoc 标签的详细说明及其示例。

@param

描述函数参数。

示例 1:基本用法

/**
 * 合并两个字符串。
 * @param {string} str1 - 第一个字符串
 * @param {string} str2 - 第二个字符串
 * @returns {string} 合并后的字符串
 */
function concat(str1, str2) {
  return str1 + str2;
}

示例 2:可选参数

/**
 * 创建用户简介。
 * @param {string} name - 用户姓名
 * @param {number} [age] - 用户年龄(可选)
 * @returns {string} 简介
 */
function createProfile(name, age) {
  return age ? `${name}, ${age} years old` : name;
}

@returns

描述函数返回值。

示例 1:基本用法

/**
 * 获取当前时间戳。
 * @returns {number} 当前时间戳(毫秒)
 */
function getTimestamp() {
  return Date.now();
}

示例 2:复杂返回值

/**
 * 获取用户详细信息。
 * @returns {{id: number, name: string}} 用户对象
 */
function getUserDetails() {
  return { id: 1, name: "Bob" };
}

@type

指定变量或属性的类型。

示例 1:简单 基本类型

/**
 * 用户的年龄。
 * @type {number}
 */
let userAge = 25;

示例 2:复杂类型

/**
 * 坐标点。
 * @type {{x: number, y: number}}
 */
const point = { x: 10, y: 20 };

@class

标记一个类。

示例

/**
 * 表示一辆汽车。
 * @class
 */
class Car {
  /**
   * @param {string} model - 汽车型号
   */
  constructor(model) {
    this.model = model;
  }
}

@module

标记一个模块。

示例

/**
 * @module stringUtils
 */

/**
 * 反转字符串。
 * @param {string} str - 输入字符串
 * @returns {string} 反转后的字符串
 */
function reverse(str) {
  return str.split("").reverse().join("");
}

@typedef

定义自定义类型。

示例 1:简单类型

/**
 * @typedef {Object} Address
 * @property {string} city - 城市
 * @property {string} country - 国家
 */

/**
 * @type {Address}
 */
const home = { city: "Beijing", country: "China" };

示例 2:嵌套类型

/**
 * @typedef {Object} Employee
 * @property {string} name - 员工姓名
 * @property {Address} address - 员工地址
 */

/**
 * @type {Employee}
 */
const employee = {
  name: "Tom",
  address: { city: "Shanghai", country: "China" },
};

@property

描述对象属性。

示例

/**
 * 应用程序设置。
 * @type {Object}
 * @property {boolean} debug - 是否启用调试模式
 * @property {string} env - 运行环境
 */
const settings = {
  debug: true,
  env: "development",
};

@example

提供使用示例。

示例

/**
 * 将字符串转换为大写。
 * @param {string} text - 输入文本
 * @returns {string} 大写文本
 * @example
 * const result = toUpper("hello"); // result is "HELLO"
 */
function toUpper(text) {
  return text.toUpperCase();
}

@throws

描述可能抛出的异常。

示例

/**
 * 除以一个数字。
 * @param {number} a - 被除数 <query>尽可能多的对所有的知识点进行举例</query>
 * @param {number} b - 除数
 * @returns {number} 商
 * @throws {Error} 如果 b 为 0
 */
function divide(a, b) {
  if (b === 0) throw new Error("Division by zero");
  return a / b;
}

@see

提供相关参考链接。

示例

/**
 * 计算平方根。
 * @param {number} n - 输入值
 * @returns {number} 平方根
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt}
 */
function sqrt(n) {
  return Math.sqrt(n);
}

最佳实践

以下是编写高质量 JSDoc 的建议及其示例。

1. 保持一致性

示例

/**
 * 获取用户名。
 * @param {string} id - 用户ID
 * @returns {string} 用户名
 */
function getUsername(id) {
  return `user_${id}`;
}

/**
 * 获取用户邮箱。
 * @param {string} id - 用户ID
 * @returns {string} 邮箱
 */
function getEmail(id) {
  return `user${id}@example.com`;
}

2. 简洁明了

示例

/**
 * 检查数字是否为偶数。
 * @param {number} num - 输入数字
 * @returns {boolean} 是否为偶数
 */
function isEven(num) {
  return num % 2 === 0;
}

3. 及时更新

示例(更新前)

/**
 * 加 1。
 * @param {number} x - 输入值
 * @returns {number} x + 1
 */
function increment(x) {
  return x + 1;
}

示例(更新后)

/**
 * 加指定值。
 * @param {number} x - 输入值
 * @param {number} [step=1] - 增量,默认为 1
 * @returns {number} x + step
 */
function increment(x, step = 1) {
  return x + step;
}

4. 使用类型

示例

/**
 * @typedef {Object} Product
 * @property {string} name - 产品名称
 * @property {number} price - 产品价格
 */

/**
 * 获取产品信息。
 * @param {string} id - 产品ID
 * @returns {Product} 产品对象
 */
function getProduct(id) {
  return { name: `Product ${id}`, price: 100 };
}

5. 提供示例代码

示例

/**
 * 过滤数组中的奇数。
 * @param {number[]} numbers - 输入数组
 * @returns {number[]} 奇数数组
 * @example
 * const odds = filterOdds([1, 2, 3, 4, 5]); // odds is [1, 3, 5]
 */
function filterOdds(numbers) {
  return numbers.filter((n) => n % 2 !== 0);
}

参考资料


通过以上大量示例,本指南涵盖了 JSDoc 的基本语法、最新特性、标签详解和最佳实践的每个知识点。希望这些示例能帮助你全面掌握 JSDoc 的用法,并在项目中编写出高质量的文档!