在 TypeScript 中使用 JSDoc 为函数的多个对象参数写注释

最近在将一个使用 JavaScript 写的 npm 包重构成 TypeScript 。重构完后,发现原先的 JSDoc 注释在 ts 文件编译后失效了,便搜索了一下,但是谷歌并没有找到我所想要的答案,便只能自己研究了。这篇算是记录一下研究结果。

首先说明一下 JSDoc 的函数参数注释写法:在函数上方,内容放置于多行注释内,下面是一个基础的例子,详细内容请参考 Use JSDoc: @param

/**
 * @param somebody
 */
function sayHello(somebody) {
    alert('Hello ' + somebody);
}

至于为什么要使用 JSDoc ?因为可以为函数参数添加描述信息(这样更新参数后就不用更新文档啦 x )。

我先试着使用了 TypeScript 的 interface 关键词,先编写两个接口,然后将函数的参数的类型设置成对应接口,但是这样会使 VSCode 的代码提示只显示函数参数的类型,不显示类型的内容(如图 1 所示),具体例子如下

/** 这是 bar 数组 */
interface Bar {
  /** 这是 bar 数组的 i 字段 */
  i: string;
  /** 这是 bar 数组的 j 字段 */
  j: string;
}
/** etc 对象 */
interface Etc {
  /** 这是 etc 对象的 x 字段 */
  x: boolean;
  /** 这是 etc 对象的 y 字段 */
  y: string;
  /** 这是 etc 对象的 z 字段 */
  z: string;
}
/** foo 函数的描述
 * @param {Bar[]} bar - 这是 bar 数组
 * @param {String} bar[].i - 这是 bar 数组的 i 字段
 * @param {String} bar[].j - 这是 bar 数组的 j 字段
 * @param {Etc} etc - etc 对象
 * @param {Boolean} etc.x - 这是 etc 对象的 x 字段
 * @param {String} etc.y - 这是 etc 对象的 y 字段
 * @param {String} etc.z - 这是 etc 对象的 z 字段
 */
const foo = (
  bar: Bar[] = [],
  etc: Etc = {
    x: true,
    y: './y',
    z: '',
  },
) => {};

  

 图 1

这显然不是我所想要的。于是便尝试不将类型抽离,而是直接在函数参数后面定义,写完编译后看结果,完美。例子如下

/** foo 函数的描述
 * @param {Object[]} bar - 这是 bar 数组
 * @param {Object} etc - etc 对象
 */
const foo = (
  bar: {
    /** 这是 bar 数组的 i 字段 */
    i: string;
    /** 这是 bar 数组的 j 字段 */
    j: string;
  }[] = [],
  etc: {
    /** 这是 etc 对象的 x 字段 */
    x: boolean;
    /** 这是 etc 对象的 y 字段 */
    y: string;
    /** 这是 etc 对象的 z 字段 */
    z: string;
  } = {
    x: true,
    y: './apis',
    z: '',
  },
) => {};

 图 2

posted @ 2021-09-18 16:29  FreezeNow  阅读(1838)  评论(0编辑  收藏  举报