首页 > 解决方案 > 从导入的类型创建 typedef

问题描述

要配置我的模块,用户必须从配置文件中导出一个函数:像这样

export default (foo, bar, baz) => {}

由于这些都是复杂类型,为了让事情更简单一些,我想添加它们可以与 JSDoc 一起使用的类型。

现在,以下内容功能齐全,但有点重复。

/**
 * @param {import('module').Foo} foo
 * @param {import('module').Bar} bar
 * @param {import('module').Baz} baz 
 */
export default (foo, bar, baz) => {}

理想情况下,我想要简单地从创建一个 typedef import('module'),例如:

/**
 * @typedef {import('module')} Module
 *
 * @param {Module.Foo} foo
 * @param {Module.Bar} bar
 * @param {Module.Baz} baz
 */
export default (foo, bar, baz) => {}

虽然这似乎不起作用,但有没有办法让它工作?真正的函数有 6 个参数,而不是 3 个参数,所以import('module')一行一行地写起来有点可笑。

反正有这种行为吗?如果需要,我可以编辑 TS,现在它只是简单的export type Foo...等等。

标签: typescriptjsdoc

解决方案


我花了很多时间试图弄清楚这一点。许多答案是特定于 TypeScript 的。这是我在我的 commonJS 应用程序中发现的工作(不需要导入/导出模块)。

  • 创建一个 .js 文件,例如 typedefs.js
  • 在 typedef(s) 上使用 @exports
  • (可选)如果您希望将 @namespace 与类型定义分开,则将 @namespace 放在文件顶部,并将 @memberof 放在 typedef(s) 中
  • 在另一个文件中按名称引用 typedef
  • 注意:typedefs.js 文件需要在您运行 jsdoc 的文件夹中——尽管不一定在同一级别
    • 例如jsdoc -r /project/folder,“文件夹”包含 typedefs.js 文件和引用 typedef 的文件

typedefs.js 文件内容:

/**
 * @namespace typedefs
 */

/**
 * @exports  myDef
 * @typedef  myDef
 * @type     {Object}
 * @property {string} aString
 * @property {Object} anObject
 * @memberof typedefs
 */

在另一个文件(例如文件夹/file.js)中使用的 typedef:

/**
 * I'm a function
 * @param   {Object}  state
 * @param   {myDef}   x
 * @returns {Object}  state
 */
const function = (state, x) => state;

推荐阅读