jsdoc:来自其他模块的引用typedef-ed类型

时间:2017-03-16 08:53:53

标签: jsdoc jsdoc3

假设我在js模块中有一个typedef类型

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

是否可以在另一个模块中引用此类型,以便在jsdoc生成的HTML页面中,类型显示为typedef-ed模块的链接?

我试过这种变化,但似乎没有任何作用......

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

6 个答案:

答案 0 :(得分:5)

这对我有用......

// 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) {
  //...
};

答案 1 :(得分:0)

以上答案在搜索结果中显示很高,因此我正在记录对我有用的内容,以防它对处于类似情况的人有所帮助。

我将Visual Studio代码用于在所有模块上均带有// @ts-check的节点项目。在module:语法上使用上述语法会出现问题。另外,代码帮助无法正常工作。我花了一段时间,但答案却很简单

如果我在模块myTypedef中具有typedef myModule,则在我需要myModule的第二个模块中
mm = require(myModule)
我可以用类似
的东西 /** @param {mm.myTypedef} myParamName */

答案 2 :(得分:0)

我已经尝试了以上两种方法。

首先,对于@typedef module:foo.Foo,VSCode在与any相同的文件中处理Foo的用法。我没有接受。

第二,在使用ES6导入时,出现以下问题:

import foo from 'foo'

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

另一方面,即使使用JSDoc模块语法,VSCode仍可以识别import { Foo } from 'foo' 没有

/**
 * @module bar
 */

此外,我还能够引用导入类型的属性,即:

import { Foo } from 'foo'

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

注意

该项目使用Babel,并假定使用代码导入的编译代码在没有编译器的情况下是不可行的。

答案 3 :(得分:0)

许多库从其根文件导出类型,要访问 typedef 中的类型,请将导入更改为使用 import * as 格式。

例如:

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


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

答案 4 :(得分:0)

我正在使用 vscode-powertools 脚本,该脚本提供对 vscode 模块在运行时的访问(而不是在编辑时通过本地 {{ 1}}).

如果我尝试使用通常的 jsdoc node_modules

导入类型
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)

答案 5 :(得分:0)

TypeScript 不支持 module 语法,所以如果你到达这里假设它可以工作,我无法让上述解决方案工作。

要使其与 TypeScript 一起使用,请使用 Import Types

对于 OP,我的做法是

// 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 代码中特定文件的打字稿检查,以帮助您为将来转向打字稿做好准备。

// @ts-check