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

2q5ifsrm  于 2023-05-06  发布在  Node.js
关注(0)|答案(3)|浏览(374)

假设我有一个名为“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
  }
}

现在,在名为“File2.js”的文件中,我在构造函数中引用了这个对象,并将其设置为新的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;

我使用Visual Studio Code进行开发,所以通过按Ctrl+Space我可以获得智能感知。在文件1中,当我创建person对象时,IntelliSense告诉我username是一个字符串,realname是一个字符串,isUnique是一个布尔值。但是,当我进入file 2并通过this.person引用新创建的person时,当键入this.person.username时,它并没有出现预期的结果“Username:字符串”。
是否可以在vanilla Node.js的File 2中使用typedef MyObject1,或者我运气不好?
编辑:有了更多的信息,我能够用TypeScript的@export和@import找到答案,以及我尝试过的各种标签。但都无济于事。我还尝试将File1.js标记为@module,并执行module:mymodule~MyMethod,但每次我这样做时,它都会将this.person标记为NodeModule而不是方法本身。

ybzsozfc

ybzsozfc1#

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

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

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

class File2 {
...

对我很有效。

9lowa7mx

9lowa7mx2#

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

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

export const Types = {}

然后在你的其他文件中,你可以导入它,并拥有来自那个虚拟对象的类型:
File1.js

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

/** @type {Types.MyType} */
const myVar = { name : 'Roy', description : 'abc123'};

优点:

  • 更“干净”--要写的代码更少
  • 只需导入一次
    cons:
  • 有点儿蹩脚
  • 不习惯用语
  • 你可能会得到错误:

此导入从不用作值,必须使用“import type”,因为“importsNotUsedAsValues”设置为“error”
如果你有那面旗。
要绕过这个警告,你只需要使用ts-ignore来禁用它:

// @ts-ignore  
import * as Types from "./types.js";
wztqucjr

wztqucjr3#

另一个解决方案是添加一个类型脚本声明文件@types/myTypes.d.ts...IDE知道如何处理这些,因为它们是.d.ts,它们会自动“导入”到每个文件中。
唯一的缺点是它们必须是纯类型脚本,所以不能有数组之类的东西。
它还可以方便地将其他@类型添加到项目中,如@types/chrome,用于chrome扩展(例如。yarn add @types/chrome
您可能需要配置IDE以将它们用作库。以下是在WebStorm中执行此操作的位置:

相关问题