返回的类实例的 JSDoc 类型

Fel*_*ann 4 node.js jsdoc jsdoc3 visual-studio-code es6-modules

我将 Node.js 与两个模块和一个依赖于它们的脚本一起使用:

库/Bar.js

module.exports = class Bar {
  // ..
};
Run Code Online (Sandbox Code Playgroud)

库/Foo.js

const Bar = require('./Bar.js');

module.exports = class Foo {
  /**
   * @return {Bar} A Bar instance
  */
  get someBar() {
    return new Bar();
  }
};
Run Code Online (Sandbox Code Playgroud)

主文件

const Foo = require('./lib/Foo.js');

checkFoo(new Foo());

/**
 * @param {Foo} foo A Foo instance
*/
function checkFoo(foo) {
  foo. // I get suggestions for Foo properties
  foo.someBar. // I get suggestions for Bar properties

  checkBar(foo.someBar);
}

/**
 * @param {Bar} bar a Bar instance
*/
function checkBar(bar) {
  bar. // I get no suggestions!
}
Run Code Online (Sandbox Code Playgroud)

我的代码编辑器 Visual Studio Code 使用 IntelliSense 向用户提供有关 Foo 和 Bar 属性的建议,这些建议在checkFoo方法内部正常工作,因为类型foo声明为Foo对象,并且类型foo.someBarFoo类中声明为Bar对象。

但是,只要我将此Bar实例传递给另一个方法 ( checkBar),Bar就无法识别该类型(可能是因为我不需要该模块)。JSDoc 中是否有特殊语法来指定在另一个模块中声明的类型?或者这只是 VSCode 的一个问题?

Bru*_*ant 7

您不再需要导入类型(例如,这可能会破坏 linter)。相反,您可以使用导入类型语法来提示 VSCode(实际上是 TypeScript):

const Foo = require('./lib/Foo.js');

...

/**
 * @param {import('./lib/Bar.js').default} bar a Bar instance
 */
function checkBar(bar) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,关键字 default 仅是必需的,因为它是默认导出。