javascriptvisual-studio-codejsdoc

Refer to type in different file in JSDoc without importing


I'm writing JavaScript (ES6) code in Visual Studio Code and enabled VSCode's type checking as explained in the VSCode docs.

When referring to a type that is defined in another file (Track in the example below), I get an error like [js] Cannot find name 'Track' at the JSDoc reference to that type unless I import it. When I import this type, I get an error from ESLint: [eslint] 'Track' is defined but never used. (no-unused-vars)

I don't want to disable the ESLint rule. Is there a way to import the type only for the type checks in 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) : [];
}
...

Solution

  • You can use 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) : [];
    }
    ...
    

    Since Track is exported as default, you could also use:

    /** @param {Iterable<import("./Track").default>}
    

    Or as Tiago pointed out:

    /** @typedef { import('./Track').default } Track */
    
    /**
     * Creates a new track list.
     * @param {Iterable<Track>} tracks the tracks to include
     */
    ...