JSDoc - 给JS插上类型的翅膀

229 阅读1分钟

安装

npm install -g jsdoc

生成

jsdoc [path]

然后会生成 out 文件夹,打开 html 就可以看到了

配置检测 JS

{
  "compilerOptions": {
    "checkJs": true
  }
}

注释

必须以两个星号开头才能被解析

标记函数

  1. 普通用法
/**
 * 这是一个函数的注释
 * @param {string} name 必选参数
 * @param {number} [age=18] 可选参数带默认值 
 * @param {?number} age1 可选参数不带默认值
 * @returns {Promise<boolean>} 这是函数的返回值
 */
  1. 函数重载
/**
 * @overload
 * @param {string} value
 * @return {void}
 */
/**
 * @overload
 * @param {number} value
 * @param {number} [maximumFractionDigits]
 * @return {void}
 */
/**
 * @param {string | number} value
 * @param {number} [maximumFractionDigits]
 */
  1. 使用对象进行标记
/**
 * @function
 * @param {number} a
 * @param {number} b
 */
const sum = (a, b) => {}
  1. 使用对象标记重载
/**
 * @type {{
 *   (ticket: string, userid: string): void;
 *   (ticket: number, firstname: string, lastname: string): void;
 * }}
 */
 const assignSlave = (ticket, userid, lastname = "") => {}

定义类型

  1. 定义对象类型
/**
 * @typedef {{ name: string, age: number }} Person
 */
/**  
* User type definition  
* @typedef {Object} User  
* @property {string} email  
* @property {string} [nickName]  
*/
  1. 定义函数类型
/**
 * @callback requestCallback
 * @param {number} responseCode
 * @param {string} responseMessage
 */

泛型

  1. 使用 @template
/**
 * @template {Array} [T=number[]]
 * @param {T} array
 * @returns T['length']
 */
function t(array) {
  return array.length
}
  1. 使用 typescript
/**
 * @type {{<T extends Array = number[]>(array: T): T['length']}}
 */
function t1(array) {
  return array.length
}

导入其他文件定义的类型

这个导入的可以是 @typedef 标记的,也可以是 .d.ts 文件的,甚至是其他 ts 文件中定义的

/**
 * @type {import('./index').Person} person 从第三方模块导入
 */

类型体操

就和 ts 里面一样玩耍就可以了。

/**
 * 搜索结果
 * @type {Awaited<ReturnType<typeof queryCustomerOrShopList>>['list']}
 */
results: [],

其他类型

  1. 弃用
/**  
* @deprecated since version 2.0  
*/  
function old() {}

参考

jsdoc 官方文档