返回类实例的JSDoc类型

时间:2017-08-04 11:40:36

标签: node.js visual-studio-code jsdoc es6-modules jsdoc3

我正在使用带有两个模块的Node.js和一个依赖于它们的脚本:

LIB / Bar.js

module.exports = class Bar {
  // ..
};

LIB / Foo.js

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

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

main.js

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!
}

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

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

2 个答案:

答案 0 :(得分:2)

你的怀疑是正确的。目前,您还需要导入Bar以在jsdoc中使用其类型:

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

...

/**
 * @param {Bar} bar a Bar instance
 */
function checkBar(bar) {
    ...
}

我们正在跟踪对此等级requireimport的JSDoc的支持:https://github.com/Microsoft/TypeScript/issues/14377

答案 1 :(得分:2)

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

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

...

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

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