DEV Community

Cover image for 【TypeScript 30】Day 3:函式型別
Angus
Angus

Posted on

【TypeScript 30】Day 3:函式型別

繼昨天提到的基礎物件型別後,接著就來看看同為物件型別中的函式型別吧 ( JS 中所有東西都是物件或純值 )。

物件型別之函式型別 Object Types

這篇一樣要看函式型別的推論與註記是如何運作的,首先從最基本的開始看起,宣告一個 simpleFunction 的函式,型別推論出來的結果是 () => void也就代表 輸出端是空的 **或代表不回傳的狀態。**

目前的參數是空的,如下圖,如果加入了參數之後呢 ?

TypeScript 就對參數提出意見了,在這裡要注意下錯誤訊息,TypeScript 在這裡把參數判斷為 any 不過 TypeScript 在意的點是沒有對參數進行型別的判斷,不過 Day 1 我們有提到對於 TypeScript 是不太管 any 這個型別的。

** Implicit Any — 當沒有設置參數型別時,TS 就會很貼心的幫我們把值設置為 any 達到警告的效果。*

為何 TS 突然在意起 any 型別了呢 ?

TS 如果要推論出函式輸出的型別的話,前提是要先知道輸入的型別是甚麼。

假設有個相加的函式 addition 在參數 num1、num2 ,在型別是 any 的情況下,此函式輸出的結果可能會是數字的 "17 " 又或者是字串連接的 "89",如此一來我們就得猜當時寫這個函式的開發者預期輸出、輸入的型別與結果,對於維運專案的人員來說是很大的精神消耗。

如果今天我們把參數的型別故意定義成 any 的話 shouldBeString 會得到數字的 17 ,不過如同此常數的名稱,經過我們的型別註記後,此 output 結果理應要是 string 才對。

錯誤的情況、TS 也不會報錯

在大部分正常的使用 TypeScript 的情況之下,我們不會特意幫型別定義為 any 尤其是參數的部分,因此,個人認為 TypeScript 很貼心的地方就在這裡了,註記參數的型別時,會給你 *Implicit Any *並警告你必須要註記對應的參數才行。

輸入型別推論輸出型別

講了這麼多來看看 TypeScript 的厲害吧,當我們把參數都註記為 number 時,TS 竟然可以直接幫我們把 return 的結果推論出來了 !!

加入空字串後更加確定 TS 神奇的地方了,在這裡並沒有報出錯誤,如同 Day 1 的原始型別 ( **Primitive Types)**一樣,自動幫我們把 addition 這個函式推論為字串。

想要讓輸出的值都是同一種型別的話該怎麼做呢 ?

直接在參數後面加上欲輸出的型別,在這裡會有兩個地方被 TS 抓毛病。

  1. 因為已經定義好 output 的型別了,因此 TS 不允許 return 的地方有其他類別出現。

  1. 一樣的 TS 還是會幫我們推論出型別。

小結:漸漸明白為何專案的系統架構一大使用 TypeScript 帶來的好處,無非就是維運上的方便以及用更多程式語言替代溝通的成本,基本物件型別裡剩下陣列還沒有介紹到,很多觀念也都是環環相扣,也有很多 TS 特有的方法可以使用,敬請期待下一篇的介紹~

Top comments (0)