如何使用Node.js在JSDoc中将typedef从一个文件"导入"到另一个文件?

Fir*_*847 11 javascript node.js jsdoc

假设我有一个名为"File1.js"的文件.在这个文件中,我导出一个对象的对象,我给每个对象一个typedef,就像这样.

/**
 * My typedef for each object.
 * @typedef {Object} MyObject1
 * @property {String} username Your username
 * @property {String} realname Your real name.
 * @property {boolean} isUnique Are you unique as a person?
 */
module.exports = {
  /**
   * Person One!
   * @type {MyObject1}
   */
  myperson: {
    username: 'TheDragonSlayer',
    realname: 'George',
    isUnique: true
  },
  /**
   * Person Two!
   * @type {MyObject1}
   */
  myperson2: {
    username: 'BobMagee',
    realname: 'Bob',
    isUnique: false
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,在名为"File2.js"的文件中,我在构造函数中引用此对象并将其设置为new MyObject1.

const persons = require('./File1.js');

class File2 {
  constructor(options = {}) {
    /**
     * The person for this file.
     * @type {MyObject1}
     */
    this.person = options.person ? persons[options.person] : persons.myperson2;
  }
}

module.exports = File2;
Run Code Online (Sandbox Code Playgroud)

我使用Visual Studio Code进行开发,因此按Ctrl + Space我会获得IntelliSense.在文件一中,当我正在创建person对象时,IntelliSense告诉我username是一个字符串,realname是一个字符串,isUnique是一个布尔值.但是,当我进入file2并引用新创建的人时this.person,在键入this.person.username时没有得到"Username:String"的预期结果.

是否可以MyObject1在vanilla Node.js中使用File2中的typedef ,或者我运气不好?

编辑:通过更多信息,我能够找到针对TypeScript的@export和@import的答案,以及我尝试过的各种标签.所有这些都无济于事.我也尝试将File1.js标记为@module,并且这样做module:mymodule~MyMethod,但每次我这样做时,它只是将this.person标记为NodeModule而不是方法本身.

Che*_*leg 35

我发现有效的另一件事是导出并清空模型,然后将其用作对类型的引用:

类型.js:

/** 
* @typedef MyType 
* @prop {string} name  
* @prop {string} description 
*/

export const Types = {}
Run Code Online (Sandbox Code Playgroud)

然后在其他文件中,您可以导入该文件并获取该虚拟对象的类型:

文件1.js

import * as Types from "./types.js"

/** @type {Types.MyType} */
const myVar = { name : 'Roy', description : 'abc123'};
Run Code Online (Sandbox Code Playgroud)

优点:

  • 很多“更干净”——需要编写的代码更少
  • 只需导入一次

缺点:

  • 有点哈克
  • 不惯用
  • 你可能会得到这样的错误:

此导入永远不会用作值,并且必须使用“导入类型”,因为“importsNotUsedAsValues”设置为“错误”

如果你有那个标志。

要绕过该警告,您只需使用 ts-ignore 禁用它:

// @ts-ignore  
import * as Types from "./types.js";
Run Code Online (Sandbox Code Playgroud)

  • 这对于 vanilla js 来说非常强大。它使打字稿几乎显得多余 (4认同)

小智 16

File2.js使用该函数在文件中导入声明的类型import.

const persons = require('./File1.js');

/**
 * @typedef {import('./File1.js').MyObject1} MyObject1
 */

class File2 {
...
Run Code Online (Sandbox Code Playgroud)

这个对我有用.

在此输入图像描述 在此输入图像描述

  • 有什么方法可以不重复输入 `import('./File1.js')`?(如果我还需要“file1.MyObject2”和“file1.MyObjectN”)。– 执行 `@typedef {import('./File1.js')} file1` 和 `@typedef {file1.MyObject2} MyObject2` MyObject2 只是别名并丢失定义详细信息,被标记为 `/*unresolved*/any` 。 (11认同)
  • 这是 TypeScript 特定的语法。投票给 https://github.com/jsdoc/jsdoc/issues/1645。 (7认同)