Как сослаться в JsDoc (VS Code / IntelliSense) на класс из другого файла без прямого импорта? - PullRequest
0 голосов
/ 24 сентября 2019

Проблема

Я использую код Visual Studio и IntelliSense с комментариями JsDoc.У меня есть два модуля с объявлениями классов:

/**
 * This is Foo class 
 */
export default class Foo {
    constructor() {}
}

и

/**
 * This is Bar class 
 */
export default class Bar {
    constructor() {}

    /**
     * Init Bar from Foo
     * @param {Foo} foo instance of Foo
     * @returns {Bar}
     */
    static initFromFoo(foo) {
        return new Bar();
    }
}

Класс Bar используют Foo в качестве параметра для метода initFromFoo, но IntelliSense не понимает, что@param Foo относится к class Foo и не работает должным образом и говорит, что foo:any,

https://imgbbb.com/images/2019/09/24/image517c0ec9d1027ac9.png

Как я могу заставить IntelliSense работать хорошо?

То, что я пробовал

  1. Импорт ./foo в ./bar - это делает IntelliSense хорошо работающим, но мне не нужен этот импорт, мне нужна просто ссылка на определение типа.
  2. Добавить ссылку на другой файл, как в TypeScript /// <reference path="./foo"> - без эффектов
  3. Создать jsconfig.json файл со следующим содержимым:
{
    "compilerOptions": {
        "target": "es6",
        "allowSyntheticDefaultImports": true,
        "checkJs": true
    },
    "exclude": [
        "node_modules"
    ]
}

нетэффекты тоже.Это просто выдвигает на первый план ошибку Cannot find name 'Foo'.ts(2304)

PS Это похоже на ограничение IntelliSense, связанное с модулями ES6.Потому что, если я удаляю export/import из обоих файлов, IntelliSense будет работать как положено

https://i.ibb.co/CPL1gJC/image.png

https://i.ibb.co/xmXqzSk/image.png

PSS Извините за ссылки на изображениямой репо слишком низок для публикации изображений.

1 Ответ

0 голосов
/ 25 сентября 2019

Можно импортировать тип с помощью оператора import ( path ) .Например:

/**
 * Init Bar from Foo
 * @param {import('./foo').default} foo instance of Foo
 * @returns {Bar}
 */
static initFromFoo(foo) {
    return new Bar();
}

ИЛИ

/**
 * @typedef {import('./foo').default} Foo
 *
 * Init Bar from Foo
 * @param {Foo} foo instance of Foo
 * @returns {Bar}
 */
static initFromFoo(foo) {
    return new Bar();
}

PS Это взлом только для кода Visual Studio.Это не действительно JsDoc.

...