簡體   English   中英

Visual Studio Code 中的異步智能感知節點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');
})();

但是,由於在聲明doSomethingUsingMyLoadedModule function 之后才分配asynchronousModule模塊,因此智能感知無法在該 function 內自動完成/自動填充asynchronousModule模塊。

所以我想知道是否有一種方法可以明確地告訴智能感知在聲明時過早地為我們的變量賦值,使用內聯注釋或類似的方法。 例如,第一行是這樣的:

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

那會很棒,但可能是一廂情願的想法。 但是,也許還有其他方法可以將智能感知用於異步模塊,而不必將我的整個文件包裝在異步 function 中? 我的意思是把我的代碼重寫成這樣的:

(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。 但是現在,作為一個更聰明的開發人員,一個月后改變,我有一個答案。

請注意,我不一定用 promise 覆蓋模塊的導出 object 是個好主意,但這樣做過去對我有用,至少我可以使用以下方法為遺留代碼提供准確的 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實用程序中以提取其解析的 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM