Day 6 開始是認識參考型別(reference type)。
TypeScript的基本型別(primitive type)除了有以下七種JavaScript就有的基本型別:
還有TypeScript自己內建的基本型別 any
、unknown
、void
、never
,除此之外都是參考型別。
今天開始同樣是先介紹在 JavaScript 也有的 Array 和 Object,不過由於 Object 的篇幅比較長,明天才會討論 Object。
另外,為了凸顯 TypeScript 和 JavaScript 的不同,這兩篇文章也會稍微深入一點點這兩個型別在TypeScript的特性和使用方式。
在JavaScript裡面,一個陣列(array)型別可以儲存任意型別的元素,例如:
// JavaScript
let arr = [1, hello", false];
而TypeScript則是可以指定只能儲存特定型別的陣列,其宣告方式如下:
// TypeScript
let strArr: string[] = ["1", "2", "3"]; // 只能儲存string型別元素的array
strArr.push("4"); // ok, ["1", "2", "3", "4"]
let numArr: number[] = [1, 2, 3] // 只能儲存number型別元素的array
numArr.push("4"); // error, number型別array不能儲存string型別的"4"
如果宣告了一個儲存 any
型別元素的陣列,就等於是在TypeScript的世界裡,使用了一個JavaScript版本的陣列:
// TypeScript
let anyArr: any[] = [1, "hello", false];
anyArr.push("4"); // ok, [1, "hello", false, "4"]
當然,陣列的元素也可以是參考型別,例如宣告一個可儲存物件型別元素的陣列:
let person: {id: number, name: string}[] = [
{id: 1, name: "Alice"},
{id: 2, name: "Ban"},
{id: 3, name: "Crow"},
];
不過當今天想要儲存不同型別元素,而且不想儲存物件型別又不希望宣告一個 any
型別的陣列,TypeScript也能指定可儲存特定基礎型別元素的陣列。
例如宣告一個可儲存 string
型別元素們同時也能儲存 number
型別元素們的陣列,宣告方式如下:
let snArr: (string | number) = [1, "2", 3];
snArr.push("4"); // ok
像上面這段 string | number
可以是 string
也可以是 number
的用法,在TypeScript裡稱作 Union 型別。
過幾天會再詳細一點介紹 Union
這個型別,今天只是想多說明一下有其他比較特別的宣告方式,所以就點到為止吧。
最後,稍微提一下,TypeScript畢竟是從JavaScript延伸出來的,所以JavaScript陣列擁有的方法,基本上TypeScript陣列也都會有,例如 push
、pop
、forEach
、map
等。
參考資料
TypeScript: JavaScript With Syntax For Types
TypeScript Tutorial