[TypeScript] 關於型別系統

TypeScript 有七種原始資料型別(primitive):

  • null
  • undefined
  • boolean
  • string
  • number
  • bigint // 0n, 2n, -4n
  • symbol // Symbol(), Symbol(“hi”)

註:在 JS 當中,能表示的範圍整數為 Math.pow(-2, 53)+1 到 Math.pow(2, 53) – 1,若超過這個範圍,建議可使用 bigint 型別。

型別系統

型別系統(type system),是一組規則,主要是讓程式理解編譯語言中,可能具有的結構型別。

運作邏輯如下:

  • 讀取所寫的程式碼,並分析所有型別和數值。
  • 對於每個數值,檢查其初始宣告,有包含哪些型別。
  • 對於每個數值,檢查後續的程式碼中,使用它的所有方式。
  • 如果數值的用途與其型別不相符,就向開發者報出可能的警告或錯誤訊息。

型別註記

關於 any

宣告一個變數,沒有給它初始值。在預設的情況下,TypeScript 會預設該變數是 any 型別:該型別的意思是可以是任何資料型態都可。

也就是 TypeScript 不會強制執行給它任何特定的型別,而是會在每次指派新資料的時候,對該變數型別做解析。

例:

let rocker;            // 型別是 any

rocker = "Carlos";     // 型別會變成是 string
rocker.toUpperCase();  // 可以正常執行該函式

rocker = 19.58;        // 型別會變成是 number
rocker.toPrecision(1); // 可以正常執行該函式

rocker.toUpperCase(); // 會報錯,型別 number 沒有 toUpperCase() 函式。

註:儘量不要將變數設定成 any 型別,還為違反了 TypeScript 型別檢查的目的!當 TypeScript 知道資料應該是什麼型別時,效果才是最好的。

型別註記的表示

TypeScript 提供了一種表示方式,無須給它初始值,即可宣告該變數是什麼型別,稱為型別註記(type annotation)。型別註記放在變數名稱之後,包含一個冒號,後面緊接著一個型別名稱。例:

let rocker: string; // 此為型別註記,rocker 變數為 string 型別
rocker = "test name";

註:型別系統中的任何內容程式,都不會被複製到輸出的 JavaScript 中。因此,TypeScript 型別不會影響 JavaScript。

不必要的型別註記

例如以下例子,string 型別註記就是多餘的,因為 TypeScript 已經可以推斷出 firstName 是 string 型別:

let firstName: string = "Mary";

型別樣式

型別也可以是更複雜的樣式,尤其是物件。在以下的例子中,TypeScript 知道 cher 物件沒有 middleName 屬性,所以提出警示:

let cher = {
  firstName: "abc",
  lastName: "def"
};

cher.middleName; // 型別 '{ firstName: string; lastName: string; }' 沒有屬性 'middleName'。

留言

發佈留言