参考在 JSDoc 中输入不同的文件而不导入

Refer to type in different file in JSDoc without importing

我正在 Visual Studio 代码中编写 JavaScript (ES6) 代码并启用 VSCode 的类型检查,如 VSCode docs 中所述。

当引用在另一个文件中定义的类型时(下例中的 Track),我收到类似 [js] 找不到名称 'Track'[ 的错误=22=] 在 JSDoc 引用该类型,除非我导入它。当我导入这种类型时,我从 ESLint 得到一个错误:[eslint] 'Track' is defined but never used。 (没有未使用的变量)

我不想禁用 ESLint 规则。有没有办法导入类型 only 用于 VSCode 中的类型检查?

import Track from "./Track";

export default class TrackList {

/**
 * Creates a new track list.
 * @param {Iterable<Track>} tracks the tracks to include
 */
constructor(tracks) {
    this._tracks = tracks ? Array.from(tracks) : [];
}
...

我有一个类似的问题,这是我如何解决的。

//file.d.ts
export interface Foo {
    bar: number;
}

export as namespace Baz;

这样做将使 Baz 命名空间成为全局命名空间,这样您就可以在任何地方使用它而无需导入

/**
 * @param {Baz.Foo} arg 
 */
function test(arg) {

}

现在您可以在 VSCode.
中获得智能感知和类型检查

只是为了保持这个主题的更新:

使用 typescript@2.9,您将能够导入 JSDoc typedef,它们会自动导出。

查看 this issue 中的实际示例。 您还可以浏览 webpack 的代码,看看他们如何使用 JSDoc 和 typescript 静态检查他们的纯 JS 源代码库。这里是 their issue 和 JSDoc 约定,您可以从中获得灵感。

禁用 es-lint 警告的解决方法:在未使用导入的行尾使用 //eslint-disable-line no-unused-vars 注释。

import Track from './Track'; //eslint-disable-line no-unused-vars

export default class TrackList {

/**
 * Creates a new track list.
 * @param {Iterable<Track>} tracks the tracks to include
 */
constructor(tracks) {
  this._tracks = tracks ? Array.from(tracks) : [];
}
...

您可以使用 import("%YOUR_LIB%").%TYPE%:

export default class TrackList {

/**
 * Creates a new track list.
 * @param {Iterable<import("./Track").Track>} tracks the tracks to include
 */
constructor(tracks) {
    this._tracks = tracks ? Array.from(tracks) : [];
}
...