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
实用程序中以提取其已解析的对象。
我经常编写异步模块,由于它们的异步性质,我将在一些初始化代码期间要求、解析然后分配这些模块。例如:
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
实用程序中以提取其已解析的对象。