TypeScript — Type Inference & Annotation(2)

SunBu
UNNO Technology
Published in
4 min readJun 4, 2020

運用型別系統必備的核心觀念

兩個名詞要先搞懂:

  1. 註記(Annotation):使用文字標明變數或函式的型別方式
  2. 推論(Inference):程式自己判斷變數對應其值或運算過後的表達式之結果值的型別

作者先給出了一個觀念:

儘管將所有的變數、函式、表達式等,主動地、甚至是積極地註記出它們各自所代表的型別,但並不一定表示要這麼做。
有些情形是只單純依靠型別推論機制也可以寫出好維護、簡潔、易懂的程式碼。

所以要根據各種不同情形,包含:程式可讀性、上手難度、維護難度、TypeScripy 本身型別特性來判斷什麼時機適時地使用註記,亦或讓程式自己依靠推論機制就好。

判斷使用推論或註記的時機點

作者舉了三種程式寫法,分成:「100 % 積極地註記」、「100 % 消極地註記」及「適時註記和推論」,來檢視哪種方式易讀及哪些要註記和哪些放著自行推論也無仿的狀況。

100 % 積極地註記

以上程式碼過分註記其實是不需要的,像是 something 一看就知道會是數字型別,函式內部還用到了 as 關鍵字來強調回傳值是數字型別,由於函式很短以及沒有使用複合型別,所以好像也不太需要刻意強調回傳是數字型別。

最後一行的 result 變數單看是看不出其型別,所以給他註記是很合理的。然而,後面呼叫的 addSomething 函式時又再次註記其運算結果之型別,好像又太過詳細根本不必要。

100 % 消極地註記

第一行 something 變數在宣告時直接 assign 數字,用看得就可以知道是數字型別,這部分就交給 TS 推論就好,所以沒什麼問題。

函式的宣告部分,尤其是參數少了註記就有機會發生大問題,因為 x 參數沒有註記,相對地代表「任何型別的值(any)都可以代入 addSomething 裡」,這裡就有可能產生淺在的 Bug。

最後一行單看 result 變數名稱是很難猜出型別,如是猜不出來,或是很難用常識來聯想知道該型別為何,那就表示這可能是用註記的最佳時機了

適時註記和推論

函示部分限制住代入的參數只能是數字型別外,TypeScript 會靜態地偵測程式碼,如果呼叫 addSomething 時,代入不符合數字型別的值,就會自動跳出警訊。

變數 result 積極地註記型別後,可以補足模糊不清的變數命名意義、增加可讀性外,假設不小心代入錯誤型別之值,編譯器就會提醒我們並拋出錯誤訊息。

結論

型別推論與註記的使用時機:
1. 積極作註記是為了縮限型別的可能性,減少要處理的例外狀況個數、增加可讀性及讓編譯器偵測程式,確保型別不會有衝突產生。
2. 如果程式碼可讀性夠或能從命名上直接判斷出型別的話,用 TS 的推論就足矣。

資料來源:

--

--

SunBu
UNNO Technology

熱愛學習新技術和分享的年輕人,目前常用技術是 Vue、React