Тип 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) {
    ...
}

Обратите внимание, что ключевое слово по умолчанию требуется только потому, что это экспорт по умолчанию.

Другие вопросы по тегам