TypeScript筆記—類型
基本類型
TypeScript 可以先聲明類型為何(ex 字串 數字等等),不過 TypeScript 本身就可以推斷類型,如果寫 let a = 123,變數 a 就會被認定為數字型別,所以不聲明也可以
如果是 undefined 和 null 沒有宣告型別的話,則會被推斷是 any 型別
假如一開始宣告為字串,後面重新賦值的時候卻給數字就會報錯
無論有無聲明類型,上述兩者的結果是一樣的
any
甚麼型別都可以的意思,如果設定為 any 就和原本的 js 沒有差別,也會失去 TypeScript 的優勢了,所以建議不要用 any
array
陣列也可以定義類型,有兩種寫法
- 類型[]
- Array<類型>
一旦陣列聲明了類型,就不能隨意塞其他類型的值,例如聲明陣列為字串類型,裡面就不能出現數字、布林值等等
union
有時候變數或陣列裡面的值不只會有一種類型,這時候可以用 union(類型 1 |類型 2)的方式,就可以用讓陣列擁有複合型別的值
tuple 元祖
tuple 則是規範了陣列一定要有哪些類型的值,且順序必須相符,長度也是
unknown
未知的型別,乍看之下 unknown 和 any 沒有什麼差別,一樣可以塞任意值,不過 unknown 可以想成是比較安全的 any,假設要對 unKnown 型別進行操作,就會跳出警告,要求必須將 unKnown 轉換成其他的型別才可以,以下面的例子來說,unknow 會跳警告,any 則不會
斷言
斷言的用途為當 TypeScript 的型別推論不符合預期的時候,允許開發者手動指定型別為何,假設今天有個串接 api 的需求,我們會拿到 api 規格說明,知道後端給予的資料型態是甚麼,不過 TypeScript 並不會知道,因此需要透過斷言來宣告資料型別
never
指的是永遠不可能存在的值的型別,以下圖的例子來說,statusCode 已經被指定為數字,必然不會符合下方的字串的條件判斷,因此 statusCode 會被視作 never
Enum
在開發的時候,假設後端要回傳某個資料的狀態給前端,通常會傳一段代號或是數字(ex. 1 = 正常營運、2=暫停營運、3=線路異常),這時候前端需要將代號和狀態寫成一個對應表,enum 就適合用在這種對應關係上
interface
介面,用來規範物件必須定義哪些屬性或是方法,當變數 user1 被聲明為介面 User,就必須依照介面 User 的屬性做設定,必須要有相同的類型名稱和一致的型別,不然就會報錯, 假如屬性名稱後面加上問號的話,代表某些屬性可以是選填的
type
型別別名,也可以擴充原本的 type,乍看與 interface 差別不大,不過還是有著些許差異
interface 與 type 的差異
- interface 可以有多個相同名稱,會自動合併為同一個,type 則無法
- type 可以聲明為基本類型、聯合類型、元組等等,interface 則無法
- interface 可以 implement ,type 則不行