JSDoc:如何让IntelliSense / TypeScript知道其他文件中的类?

问题描述

我正在从事一个相对较大的项目,我想将JSDoc添加到我的类和文件中,以使其更容易开发。我的“ Configuration”类/对象有一个getter函数,该函数返回其“ sqlRegistry”对象的实例,该实例稍后在链中进行设置。

//configuration.js

/**
 * @returns {sqlRegistry} registry
 */
getRegistry() {
    return this._registry;
}
//sqlRegistry.js
const Configuration = require('./configuration');

class sqlRegistry {
    //other code
}

不幸的是,在带有IntelliSense / ESLint的VS Code中,它提供了一个错误,指出无法找到类“ sqlRegistry”。在任何其他情况下,我都只能将sqlRegistry.js导入configuration.js,但是在这种情况下,我不能这样做(因为sqlRegistry取决于configuration.js,如您在上面看到的那样)。

TypeScript jsdoc checker gives me an error saying it cannot find name 'SQLRegistry'

我可以在文件的顶部放置一些JSDoc注释,以指示它读取sqlRegistry.js,以便它可以识别sqlRegistry类吗?例如,类似:

/**
 * @include {@link ./sqlRegistry.js}
 */

解决方法

您的假设@include {@link ./sqlRegistry.js}在原则上非常接近。

根据TypeScript对JSDoc语法的解释,编写此代码的实际方法是

/**
 * @returns {import('./sqlRegistry.js')} registry
 */
getRegistry() {
    return this._registry;
}

请注意,实际上是TypeScript为VS Code的主要JavaScript功能(如类型推断,而非ESLint)提供了动力

此语法import('module-specifier')在类型位置,被称为import types,不要与仅输入类型混淆,并在TypeScript 2.9中引入。

这不是JSDoc的特定功能,而是来自TypeScript。

TypeScript语言服务在JSDoc注释位置中识别期望类型的语法。请注意,官方TypeScript Handbook states that

您还可以使用导入类型从其他文件导入声明。此语法是TypeScript特定的,并且与JSDoc标准不同: