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 則不行