TypeScript 異步代碼類型技巧


 

  在typescript下編寫異步代碼,會遇到難以自動識別異步返回值類型的情況,本文介紹一些技巧,以輔助編寫更健全的異步代碼。

  callback

  以讀取文件為例:

  

  readFile是一個異步函數,包含path和callback兩個參數,callback的不進行聲明類型的情況下,調用readFile后傳入的callback無法正確識別到callback的err和rst的類型。通常在這種情況下,使用者很容易出現錯用參數的情況,例如把rst當成一個字符串使用等。有了上面的類型描述后,下面的兩種調用就能讓編譯器自動檢測出錯誤:

  

  

  

  Promise

  一些可以將異步結果通過promise包裝起來的函數,typescript的初學者可能一時找不到方法去描述Promise的異步結果類型。其實官方的描述文檔中已經提供了Promise的相關描述。並提供了泛型描述接口Promise<type>來描述其異步的返回結果。

  

  例如這樣的一個函數,將返回值的類型定義為Promise<Buffer>,即表示該函數調用后返回的是一個異步結果為Buffer的Promise。

  以下是常見的調用Promise異步函數的方法:

  

  

  這樣,無論是通過then還是await調用,都能嚴格檢測到異步的返回結果(yield是一個例外,后面會提到)

 

  Callback/Promise自動識別函數

  這種函數形如:

  

  這種函數的callback參數是可選的,如果傳入callback,那么就通過回調的方式處理異步結果。如果不傳入回調,那么就會返回一個Promise。

  常見的兩種調用方式:

  

  

  泛型異步返回值

  在沒有typescript前,有很多的異步調用會更具不同的調用方式返回不同類型的結果。我們要兼容此部分代碼,可以利用重載。但更好用一點的辦法則是利用泛型來處理。

  例如有這樣的一個異步函數:

  

  用於異步克隆對象。異步的返回類型要和調用時傳入的類型相同。這里通過將參數originObj的類型限定為泛型TRst,將異步返回值的結果也限定為TRst來達到這樣的目的。這個函數調用時,也不需要自動為函數加上類型,編譯器會自動識別originObj的類型並將異步返回結果的類型設置為同樣的類型。

   

 

   yield與generator

  目前在typescript下,在generator中使用yield,是難以得到異步返回類型的。

  編譯器會默認yield等待的結果類型是個any,因此建議使用async await替代,雖然最終編譯結果相差不大。從yield切換到await有一些需要注意的地方,例如await不能直接等待Promise數組。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM