请参阅在JSDoc中键入不同文件而不导入

ral*_*stx 11 javascript jsdoc visual-studio-code

我正在Visual Studio Code中编写JavaScript(ES6)代码,并启用了VSCode的类型检查,如VSCode文档中所述.

当引用在另一个文件中定义的类型时(Track在下面的示例中),我得到一个错误,如[js]在JSDoc引用该类型时找不到名称'Track',除非我导入它.当我导入此类型时,我从ESLint收到错误:[eslint]'Track'已定义但从未使用过.(无未使用-VARS)

我不想禁用ESLint规则.有没有办法为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) : [];
  }
...
Run Code Online (Sandbox Code Playgroud)

Jer*_*emy 6

我有一个类似的问题,这是我解决它的方法。

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

export as namespace Baz;
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

现在你可以在 VSCode 中获得智能感知和类型检查。
VS代码


小智 5

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

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

用一个真实的工作示例来看看这个问题。你也可以浏览 webpack 的代码,看看他们如何使用 JSDoc 和 typescript ti 静态检查他们的纯 JS 源代码库。这是他们与 JSDoc 约定的问题,您可以从中获得灵感。

  • 为了使它更容易,将此答案应用于您的情况意味着添加 `/** @typedef { import('./Track').default } Track */` (3认同)

Mik*_* B. 5

您可以使用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) : [];
}
...
Run Code Online (Sandbox Code Playgroud)