JSDoc typedef в отдельном файле

Могу ли я определить все пользовательские типы в отдельном файле (например, types.jsdoc), чтобы их можно было повторно использовать во всем приложении? Каков правильный способ сделать это?

/**
 * 2d coordinates.
 * @typedef {Object} Coordinates
 * @property {Number} x - Coordinate x.
 * @property {Number} y - Coordinate y.
 */

Ответ 1

Обычно я делаю что-то подобное в своих проектах, разница заключается в том, что я использую расширение .js для указания файла. Webstorm отлично работает и умеет проверять типы и автоматически заполнять их. Он не узнает расширение .jsdoc (я только что проверил), поэтому придерживайтесь .js, даже если файл не содержит никакой инструкции кода.

Ответ 2

Я только что попробовал с VSCode, и он работает, только если отдельный редактор открыт в редакторе. Если нет, внешние typedefs печатаются как любые

Ответ 3

Вы можете определять типы в модуле (например, typedefs.js). Модуль содержит ваши typdefs JSDoc и может просто экспортировать неиспользуемое свойство.

// typedefs.js
/**
 * @typdef foo
 * @property {string} bar
 */

// etc.

exports.unused = {};

Чтобы использовать его, импортируйте модуль, где вам нужно сослаться на эти typdefs:

const typedefs = require("./typedefs");
/** @type {typedefs.foo} */
const fb = { bar: "hello" };

Вы можете аннотировать typedefs.js как @module или @namespace. Поскольку я использую "tsd-jsdoc" для генерации файла types.d.ts и благодаря тому, что TypeScript теперь интерпретирует модули по сравнению с пространствами имен, я аннотировал свой файл typedefs.js как пространство имен @namespace и документировал каждый typedef как член этого пространства имен:

/**
 * @namespace typedefs
 */

/**
 * @typedef foo
 * @property {string} bar
 * @memberof typdefs
 */

Надеюсь, это поможет.

Ответ 4

У меня был некоторый успех с использованием jsconfig.json и его свойства include в простом проекте JavaScript:

{
  "include": [
    "src/**/*.js"
  ]
}

Учитывая следующий проект JavaScript:

src/
├── types/
|   ├── person.js
|   ├── question.js
|
├── answer.js
├── jsconfig.json

Где и question.js и person.js являются определениями типов:

person.js

/**
 * @typedef {object} Person
 * @property {string} firstName
 * @property {string} lastName
 */

question.js

/**
 * @typedef {object} Question
 * @property {Person} askedBy
 * @property {string} text
 */

И answer.js - это функция, которая принимает вопрос и возвращает ответ:

/**
 * Takes a question and return an answer
 * @param {Question} question 
 */
function answer(question) {
  return 42;
}

Как вы можете видеть на первом скриншоте, я получаю поддержку IntelliSense при наведении указателя на тип Question:

enter image description here

Кроме того, IntelliSense теперь также может предложить завершение кода на основе моих определений типов:

enter image description here