TypeScript — Assertion
型別斷言
型別斷言語法
斷言(Assertion)使用的關鍵字是 as
或者 <T>(...)
。通常斷言的使用情境是—程式沒辦法推論(Inference)某表達式(Expression)的確切運算結果之型別,才會使用斷言來做處理這種情況。
至於是什麼情況是程式無法推論的呢? — 使用第三方的資源(Third-party resources),譬如說 JSON API 獲得的內容型別格式、讀取檔案轉成 JSON 物件的結果、使用套件提供的功能、呼叫會回傳未知結果的函示等。
斷言語法只能在表達式上,來斷言表達式所運算的結果之型別
註記 Annotation V.S. 斷言 Assertion
註記(Annotation)旨在告訴編譯器:「任何被註記到的變數、函式型別(參數、回傳值)等,都必須遵照被註記過後的變數型別」 — 關鍵字「遵照」。
斷言(Assertion)無視編譯器靜態分析整個程式碼的推論過程,果斷地告訴編譯器說:「被斷言過後的表達式之運算結果就是某某型別」—關鍵字意象是「覆蓋」該表達式的推論結果。
使用斷言要小心,千萬不要發生以下事情:
程式以後認定變數 something
為字串型別,但變數 something
實際存的是數字,以上程式碼 TypeScript 是不會出現任何錯誤訊息。
這個事情會常發生在 JSON.parse
,它回傳的結果就是 any
型別,因為該方法無法保證使用者的輸入長什麼樣子,因此只能將輸出定為 any
型別。
因此斷言要先確定會遇到什麼樣的 JSON
物件,在做相對應得斷言,就不會造成人為的 Bug 了。
資料來源: