jsdoc进阶篇,用这些常用的类型标注来完善你的js代码吧

jsdoc的好处,可以看我上一篇文章:请抛弃行内注释,教你如何在typescript中更好的写注释

如何学习jsdoc可以看官网 JSDoc 中文文档

这里就不写一些简单的例子,直接上强度。

因为我们写jsdoc大多都是写函数的注释,所以我这里就以函数为例子,先了解基本的书写格式:

js 复制代码
/**
 * @标签名 { 类型 } 变量名 - 说明
 */

// 例子
/**
 * @param { strig } id - 这是请求的id
 */

一、如何标注一个对象类型?

定义一个getData的函数,它要接收一个params参数,这个参数是一个对象,里面有method,id,page属性。我们用ts可以很轻松的写出:

typescript 复制代码
interface TypeParams {
  method: 'POST' | 'GET'
  id: string
  page: number
}

function getData(params: TypeParams) {
  console.log(params.method)
}

但是如果用的是js,要怎么去写这个标注呢?我这里提供了3种方法

1.直接在类型里面写

js 复制代码
/**
 *
 * @param {{method:'POST'|'GET', id:string, page:number}} params 请求参数
 */
function getData(params) {
  console.log(params.method)
}

优点: 书写简洁

缺点:每个属性都缺少单独的类型说明

2.通过@param,以及对对象的扩展

js 复制代码
/**
 *
 * @param {object} params - 请求参数
 * @param {'POST'|'GET'} params.method - 请求类型
 * @param {string} params.id - 请求id
 * @param {number} params.page - 请求页数
 */
function getData(params) {
  console.log(params.method)
}

优点: 每个属性都有单独的说明

缺点:书写繁杂

3.通过@typedef和@property单独写一个类型,再引用

这种写法就很像ts的类型的写法

js 复制代码
/**
 *
 * @typedef {object} TypeParams - 请求参数类型
 * @property {'POST'|'GET'} params.method - 请求类型
 * @property {string} params.id - 请求id
 * @property {number} params.page - 请求页数
 */

/**
 *
 * @param {TypeParams} params - 请求参数
 */
function getData(params) {
  console.log(params.method)
}

/**
 *
 * @param {string} code - code
 * @param {TypeParams} params - 请求参数
 */
function List(code, params) {
  console.log(params.method)
}

优点: 可以类型复用

缺点:书写不够直观

总结

建议:一般来说,我推荐第二种写法。如果有类型复用的情况,并且是复用的次数很多,才考虑第三种写法。

扩展:函数默认参数值

用法

js 复制代码
/**
 * @标签名 { 类型 }[变量名=值] 变量名 - 说明
 */

// 例子
/**
 * @param { strig }[id='abc'] id - 这是请求的id
 */
js 复制代码
/**
 *
 * @param {object} params - 请求参数
 * @param {'POST'|'GET'}[params.method='GET'] params.method - 请求类型
 * @param {string} params.id - 请求id
 * @param {number} params.page - 请求页数
 * @param {string}[token='abc123456'] token - token
 */
function getData (params, token = 'abc123456') {
	console.log(params)
}

二、如何标注一个对象数组类型?

直接在类型后面加[],就这么简单

js 复制代码
/**
 *
 * @typedef {object} TypeParams - 请求参数
 * @property {'POST'|'GET'} params.method - 请求类型
 * @property {string} params.id - 请求id
 * @property {number} params.page - 请求页数
 */
 
/**
 *
 * @param {string[]} code - code
 * @param {TypeParams[]} params - 请求参数
 */
function List(code, params) {
  console.log(params)
}

三、如何标注一个枚举类型?

在ts中,枚举类型也是我用得最多的。但是换到了js,js没有枚举类型,只能用对象代替。但是如何写出好的注释,让它显示出对应的类型呢?

这里也提供了两种写法

1.通过@type标注

js 复制代码
/**
 * 映射状态的枚举
 * @readonly
 * @enum {1|2}
 */
const EnumState = {
  /**
   * 成功的值
   * @type {1}
   */
  PASS: 1,
  /**
   * 失败的值
   * @type {2}
   */
  ERROR: 2
}

2.用@default来标注

js 复制代码
/**
 * 映射状态的枚举
 * @readonly
 * @enum {1|2}
 */
const EnumState = {
  /**
   * 成功的值
   * @default 1
   */
  PASS: 1,
  /**
   * 失败的值
   * @type 2
   */
  ERROR: 2
}

总结

比较推荐第一种的写法

四、如何标注一个class类型?

实际上class我自己写得比较少,但是可能有人还是有需求,所以这里我也写一下

js 复制代码
/**
 * @class Person
 */
class Person {
  name
  #age
  /**
   * @static
   * @type {object} friend - 朋友
   * @property {string} friend.name - 名字
   * @property {number} friend.age - 年龄
   */
  static friend = { name: '', age: 22 }

  /**
   * @constructor
   * @param {string} name - name
   * @param {number} age - age
   */
  constructor(name, age) {
    /**
     * @property {string} name - 名字
     */
    this.name = name
    /**
     * @property {number} age - 年龄
     * @private
     */
    this.#age = age
  }
}

static遗留的问题

static friend那里标注得有点问题,不知道要怎么改,看有大神救一下吗。

五、如何学习写出更好的代码标注呢?

如何学习写出更好的代码标注呢?当然是点开node_modules,看一些这些著名的包是怎么写的啦

相关推荐
人间凡尔赛14 小时前
世界模型入门实战:从RTFM到理解物理世界 | 2026深度技术解析
javascript·人工智能·深度学习·机器学习
腻害兔14 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 认证与权限:RBAC + 数据权限,这套“门禁系统“到底怎么设计的?
java·vue.js·人工智能·产品经理·ai编程
KaMeidebaby14 小时前
卡梅德生物技术快报|原核膜蛋白表达优化实操手册,膜蛋白的纯化梯度洗脱完整流程
前端·网络·数据库·人工智能·算法
大家的林语冰14 小时前
🫡 见证历史,TypeScript 7 重写成功,VS Code 原地起飞,GitHub 第一语言联手 Go 破而后立!
前端·javascript·typescript
wing9814 小时前
通往全干之路之:被迫成为全栈
前端·后端·程序员
MengMeng_102315 小时前
soc平台告警分析思路及chrome插件
前端·chrome·安全威胁分析
落落落洛克15 小时前
WAIC 2026收官复盘:国产AI打通大模型、智能体、物理机器人全产业闭环
前端
小时代的大玩家15 小时前
HarmonyOS新特性-沉浸光感在叠叠消小游戏中的落地实践
前端·harmonyos
hunterandroid15 小时前
[鸿蒙从零到一] ArkUI 状态管理实战:从 @State 到 @Provide 与 @Consume
前端
Hilaku15 小时前
为什么很多人觉得前端很简单?
前端·javascript·程序员