我经常编写异步模块,由于它们的异步特性,我会在一些初始化代码中要求、解析和分配这些模块。例如:
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
函数被声明后才被分配,智能感知不能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();
}
})();
虽然这将允许智能感知工作,并且在这个示例中它实际上看起来不错,但我真的不喜欢将整个文件的内容添加标签,尤其是当文件变大时,所以这不是我理想的解决方案。
当我第一次问这个问题时,我是一个天真的开发人员,不明白在我的编辑器中为 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
,我们用它来提取什么承诺做出决议。然后使用@type
标签,我们导入异步模块并将其包装在我们的PromiseValue
实用程序中以提取其解析对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句