iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

陣列型別

陣列可以用來存放有序的資料列表,而依據陣列內資料的型別不同,宣告方式也會有所不同。

1. 基本使用

最簡單的宣告方式是型別註記方法,使用「型別+方括號」(例如:string[])來表示,或是採用泛型(Generic)風格(例如:Array<string>)的寫法,兩種都是用來描述陣列的方式。
https://ithelp.ithome.com.tw/upload/images/20240918/20140920gle9dL9yVS.png

let arrayName: type[];

// 如果陣列裡面要放字串
let skills: string[] = [];
let skills: Array<string> = [];

// 如果陣列裡面要放數字
let luckyNumbers: number[] = [];
let luckyNumbers: Array<number> = [];

// 混和類型的陣列
let score = ["Math", 80, "English", 70];
let scores: [string, number] = [];

2. 使用陣列的方法

在 TypeScript 裡,基本上都具有跟 JavaScript 陣列相同的屬性和方法,以下是一些常用的操作範例。

// 新增一個或多個(指定順序)
skills[0] = "JavaScript";
slills[1] = "TypeScript";

// 新增一個或多個(使用 push 方法)
skills.push("React");

// 直接宣告陣列內容
skills = ["JavaScript", "TypeScript", "React"];

// 取得陣列長度
console.log(skills.length);

3. 不合法使用

當你在具備型別約定的陣列中,有不合法使用的情形,也會有對應的錯誤提示。這是因為陣列在定義時已約定並限制了型別。

// 新增型別不相容的值
luckyNumbers = [1, 2, 3, "4"];
luckyNumbers.push("4");

// 將字串指定到字串陣列裡
skills = "TypeScript"

4. 其他延伸應用

以下介紹的幾種進階用法,後續會有其他篇幅進行詳細介紹與應用,可以僅做簡單介紹。

(1) 使用介面(Interface)

interface 可以用來對應陣列的索引型別,雖然它較為複雜,但很適合用於表達特定結構的陣列。

// 定義數字索引,且每個元素值的型別也必須為數字。
interface NewArray {
  [index: number]: number;
}
let luckyNumbers: NewArray = [9, 1, 8];

(2) 使用元祖型別(Tuple Types)

當需要在陣列中混合不同型別的元素時,tuple 是合適的選擇。這種型別適合用來表達已知固定數量且類型特定的資料。

  • 基本宣告:定義一對值分別為stringnumber的陣列。
// 方法1
let tupleData = [string, number];
tupleData = ["hello", 918];

// 方法2
let tupleData: [string, number] = ["Annie", 18];

(3) 使用聯合型別(Union Types)

若陣列中的元素可以是多種不同型別,可以使用聯合型別union來處理。

let unionData: (string | number)[] = ["hello", "world", 2024];

(4) 使用任意型別(Any Types)

如果允許在陣列中出現任意型別的元素,則可以考慮使用 any。但要特別謹慎使用,避免失去了型別檢查的好處。

let allData: any[] = [
  "ithelp", 
  918, 
  {url: 'https://ithelp.ithome.com.tw/articles/918'}
];

結語

相比物件型別,陣列型別較為簡單且直觀。通常我偏好使用型別註記的方式來定義陣列,因為這樣更清晰明瞭。雖然本篇提到了延伸應用的部分,後續文章會更詳細介紹這些進階用法,以幫助大家更靈活地運用陣列型別。


上一篇
Day04:TypeScript 的物件型別(Object Types)
下一篇
Day06:TypeScript 的擴充型別
系列文
用 TypeScript 重新定義前端開發:30 天的實踐與思考30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言