Visual Studio 代码中的异步 Intellisense |节点JS

Asynchronus Intellisense in Visual Studio Code | NodeJS

我经常编写异步模块,由于它们的异步性质,我将在一些初始化代码期间要求、解析然后分配这些模块。例如:

var asynchronousModule;


function doSomethingUsingMyLoadedModule() {
    // Ideally intellisense would be able to do its thing for asynchronousModule right here
    asynchronousModule._doSomething();
}


// initializer
(async () => {
    asynchrousModule = await require('my-custom-async-module');
})();

但是,因为 asynchronousModule 在声明 doSomethingUsingMyLoadedModule 函数之后才被赋值,所以智能感知无法在该函数中 auto-complete/auto-populate asynchronousModule

所以我想知道是否有一种方法可以显式告诉智能感知 过早地 在声明时为我们的变量赋值,使用内联注释或类似的东西。例如,第一行是这样的:

var asynchronousModule; // vsc-intellisense assign-async-import my-custom-async-module

那太棒了,但可能是一厢情愿的想法。但是,也许还有其他一些方法可以利用异步模块的智能感知 而不必 将我的整个文件包装在一个异步函数中?我的意思是将我的代码重写成这样:

(async () => {
    const asynchrousModule = await require('my-custom-async-module');

    function doSomethingUsingMyLoadedModule() {
        asynchrousModule._doSomething();
    }
})();

虽然这将允许智能感知工作,而且在这个例子中它看起来确实不错,但我真的不喜欢用标签覆盖整个文件的内容,尤其是当文件变大时,所以这不是我理想的解决方案.

试试这个

const asynchrousModule = require('my-custom-async-module');

function doSomethingUsingMyLoadedModule() {
    asynchrousModule._doSomething();
}

当我第一次问这个问题时,我是一个天真的开发人员,不了解在我的编辑器中为 IntelliSense 编写 JSDoc 式语法时实际使用了多少 TypeScript。但是现在,作为一个更聪明的开发人员一个月后改变,我对此有了答案。

请注意,我不是一定要说用承诺覆盖模块的导出对象是个好主意,但这样做过去为我工作,至少我可以使用以下内容为遗留代码提供准确的 IntelliSense:

/**
 * @template T
 * @typedef  {T extends Promise<infer Value> ? Value : T} PromiseValue
 */

/** @type {PromiseValue<import('my-custom-async-module')>} */
var asynchronousModule;

@typedef 标签声明类型PromiseValue,我们用它来提取 promise 解析的内容。然后使用 @type 标签,我们导入异步模块并将其包装在我们的 PromiseValue 实用程序中以提取其已解析的对象。