【问题标题】:Refer to type in different file in JSDoc without importing参考在JSDoc中输入不同的文件而不导入
【发布时间】:2018-06-07 05:02:10
【问题描述】:

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

当引用在另一个文件中定义的类型时(以下示例中的 Track),我在 JSDoc 引用中收到类似 [js] Cannot find name 'Track' 的错误这种类型,除非我导入它。当我导入这种类型时,我从 ESLint 收到一个错误:[eslint] 'Track' is defined but never used。 (no-unused-vars)

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

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) : [];
}
...

【问题讨论】:

  • 您是否尝试在 ESLint 配置中将 Track 添加到 globals 中?
  • 或 ESLint 中的 disable rules with comments
  • @Alex 将Track 添加到全局变量并没有帮助。 JSDoc 需要对源代码的引用。禁用规则会有所帮助,但我不喜欢完全禁用规则,因为这会限制 ESLint 的使用。通过 varsignorepattern 选项仅对某些名称禁用它,但在每个其他文件中使用此模式会相当难看。
  • @ralfstx 您是否尝试过 Alex 的注释语法链接以禁用特定行或部分的规则?我无法让单行版本工作,但我能够使用禁用注释,然后导入,然后启用注释,我得到了两全其美 - eslint 检查其他所有内容,并且 Intellisense 使用正确的类型信息。

标签: javascript visual-studio-code jsdoc


【解决方案1】:

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

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

export as namespace Baz;

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

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

}

现在您可以在 VSCode 中进行智能感知和类型检查。

【讨论】:

  • 我觉得这个答案很吸引人,谢谢。这样,我们可以将类型保存在单个 d.ts 文件中,并在 JSDoc 的代码库中“导入”它们,而实际上不必在任何地方都写“导入”。有什么不喜欢的?
【解决方案2】:

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

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

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

【讨论】:

  • 为了更容易,将此答案应用于您的案例意味着添加/** @typedef { import('./Track').default } Track */
【解决方案3】:

禁用 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) : [];
}
...

【讨论】:

    【解决方案4】:

    你可以使用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) : [];
    }
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 2018-02-22
      • 1970-01-01
      • 2017-03-31
      • 2019-01-05
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多