jsdoc: ссылка на тип typedef из другого модуля

Предполагая, что у меня есть тип typedef в модуле js

// somewhere/foo.js
/**
 * @module
 */ 
/**
 * @typedef Foo
 * @type {object}
 * property {string} bar - some property
 */

Можно ли ссылаться на этот тип в другом модуле, чтобы на HTML-странице, сгенерированной jsdoc, тип отображался как ссылка на модуль typedef?

Я пробовал варианты этого, но ничего не работает...

// somewhere_else/bar.js
/**
 * @module
 */
/**
 * @param {somewhere/foo/Foo} foo - some param
 */
export default function doStuff(foo) {
  ...
}

person phtrivier    schedule 16.03.2017    source источник


Ответы (6)


Это работает для меня...

// somewhere/foo.js
/**
 * @module foo
 */
/**
 * @typedef module:foo.Foo
 * @type {object}
 * @property {string} bar - some property
 */

а также ...

// somewhere_else/bar.js
/// <reference path="foo.js" />
/**
 * @module bar
 */
/**
 * @param {module:foo.Foo} foo - some param
 */
function doStuff(foo) {
  //...
};
person Slava Ivanov    schedule 16.03.2017
comment
Полная квалификация модуля в @typedef действительно работает (я лично написал @typedef {Object} module:foo/Foo , но это дело вкуса). Однако: 1/ /// <reference path="foo.js" /> не кажется обязательным, и я нигде не смог найти его документально. 2/ если модуль имеет длинный путь (например, «где-то / foo»), печатать его везде немного утомительно, знаете ли вы какой-нибудь трюк, чтобы как-то его псевдонимить? - person phtrivier; 17.03.2017
comment
@phtrivier 1. извините, ссылка - это просто копия и вставка из моего теста, игнорируйте ее. 2. Полностью с вами согласен, немного муторно; к сожалению, псевдоним - это то, как мы документируем (особенно с прототипами). На самом деле все не так плохо, как кажется. Я вижу в этом пользу: разработчик, который использует этот метод или тип, будет точно знать, где он определен, так что это помогает не просто создать правильную документацию, но и во время разработки искать эффективные ссылки. Еще один способ использовать @exports, но я не нашел эту опцию, поэтому не могу комментировать. - person Slava Ivanov; 17.03.2017

Приведенный выше ответ отображается высоко в результатах поиска, поэтому я документирую то, что сработало для меня, на случай, если это поможет кому-то в подобной ситуации.

Я использую код Visual Studio для проекта узла с // @ts-check на всех моих модулях. Использование приведенного выше синтаксиса вызывает сбои в синтаксисе module:. Кроме того, помощь по коду не работает должным образом. Мне потребовалось некоторое время, но ответ оказался довольно простым

Если у меня есть typedef myTypedef в модуле myModule, то во втором модуле, где мне требуется myModule
mm = require(myModule)
, я могу использовать что-то вроде
/** @param {mm.myTypedef} myParamName */

person Tod    schedule 01.04.2019

Многие библиотеки экспортируют типы из своего корневого файла, чтобы получить доступ к ним в typedefs, измените свой импорт, чтобы использовать формат import * as.

Например:

import * as testingLibrary from '@testing-library/react';


/** 
 * @returns {testingLibrary.RenderResult}
 */
export function myCustomRender() { }

person Zach Posten    schedule 27.01.2021

Я пробовал оба вышеуказанных подхода.

Во-первых, в случае @typedef module:foo.Foo VSCode рассматривал использование Foo в том же файле, что и any. Что я не нашел приемлемым.

Во-вторых, при использовании импорта ES6 возникает следующая проблема:

import foo from 'foo'

/** @param {foo.Foo} a - Error Foo does not exist on foo */ 

С другой стороны, VSCode распознает import { Foo } from 'foo' без даже использования синтаксиса модуля JSDoc:

/**
 * @module bar
 */

Более того, я также смог сослаться на свойство импортированного типа, а именно:

import { Foo } from 'foo'

/** @param {Foo['bar']} bar */

Примечание

Этот проект использует Babel и предполагает, что компиляция кода, использующего импорт типов, невозможна без транспилятора.

person Mateja Petrovic    schedule 02.09.2020

Я работаю со скриптом vscode-powertools, который обеспечивает доступ в модуль vscode во время выполнения (в отличие от быть доступным для VSCode во время редактирования через локальный node_modules).

Если бы я попытался импортировать типы с помощью обычного jsdoc import

//@ts-check
/** @typedef {import('c:/Users/USERNAME/.vscode/extensions/ego-digital.vscode-powertools-0.64.0/node_modules/vscode').TextEditor} TextEditor */

Я бы получил ошибку File is not a module:

File 'C:/Users/USERNAME/.vscode/extensions/ego-digital.vscode-powertools-0.64.0/node_modules/vscode/vscode.d.ts' is not a module. ts(2306)

Итак, вот трюк, который я использую для проверки типов такого сценария:

//@ts-check
/// <reference types="c:/Users/USERNAME/.vscode/extensions/ego-digital.vscode-powertools-0.64.0/node_modules/vscode" /> 

// Allows us to reference the `vscode` module with jsdoc `@type`
async function vscodeⁱ() {if (1 == 1) return null; return import ('vscode')}

exports.execute = async (args) => {
  // Allows us to reference the `vscode` module with jsdoc `@type`
  const vscode = await vscodeⁱ()

  /** @type {vscode} */
  const vs = args.require ('vscode')

  // NB: The following code is fully typed in VSCode
  const windowᵛ = vs.window
  const editorᵛ = windowᵛ.activeTextEditor
  const start = editorᵛ.selection.start
}
person ArtemGr    schedule 11.04.2021

Синтаксис module не поддерживается TypeScript, поэтому, если вы пришли сюда, предполагая, что он работает, я не смог заставить работать приведенные выше решения.

Чтобы заставить его работать с TypeScript, используйте Import Types

Для ОП я бы сделал так:

// foo.d.ts
export type Foo = {
  /**
   * some property
   */
  bar: string,
};

Затем обратитесь к нему в модуле JS как

/**
 * @typedef { import("./foo").Foo } Foo
 */

/**
 * @param {Foo} foo - some param
 */
export default function doStuff(foo) {
  ...
}

Вы можете более строго убедиться, что все работает с отдельным файлом, добавив следующее в начало файла. Это включит проверку машинописного текста в коде Visual Studio для определенного файла, чтобы помочь подготовиться к переходу на Typescript в будущем.

// @ts-check
person Archimedes Trajano    schedule 02.06.2021