我正在使用带有两个模块的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的一个问题?
答案 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) {
...
}
我们正在跟踪对此等级require
或import
的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是必需的,因为它是默认导出。