Тип JSDoc для возвращаемых экземпляров класса
Я использую Node.js с двумя модулями и одним скриптом, который зависит от них:
Библиотека / bar.js
module.exports = class Bar {
// ..
};
Библиотека / 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?
1 ответ
Ваше подозрение верно. В настоящее время вам также необходимо импортировать Bar
использовать его тип в jsdoc:
const Foo = require('./lib/Foo.js');
const Bar = require('./lib/Bar.js');
...
/**
* @param {Bar} bar a Bar instance
*/
function checkBar(bar) {
...
}
Мы отслеживаем поддержку JSDoc-эквивалента require
или же import
здесь: https://github.com/Microsoft/TypeScript/issues/14377
Вам больше не нужно импортировать тип (например, это может привести к поломке линтеров). Вместо этого вы можете намекнуть на VSCode (на самом деле TypeScript), используя синтаксис типа импорта:
const Foo = require('./lib/Foo.js');
...
/**
* @param {import('./lib/Bar.js').default} bar a Bar instance
*/
function checkBar(bar) {
...
}
Обратите внимание, что ключевое слово по умолчанию требуется только потому, что это экспорт по умолчанию.