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]()