前一篇文章在介紹陣列型別時,有稍微帶到元組的概念。可以將元組型別(Tuple Types)理解為工作方式類似於數組的概念,但有一些額外的注意事項:
// 初始宣告
let skills: [string, number] = ['TypeScript', 100];
// 錯誤使用情形 1:多於定義的元素數量
let skills: [string, number] = ['TypeScript', 100, 88];
// 錯誤使用情形 2:元素類別不符合原定義
let skills: [string, number] = [100, 'TypeScript'];
另外也有個有趣且實用的使用方式,就是使用元組來定義顏色的 RGBA 值。在 TypeScript 3.0 後的版本,元組型別支援使用後綴問號 ?
的元素內容。所以可以將其應用在顏色的透明度(Alpha)值的可選狀況,當有需要指定時再傳入:
let favoriteColor, hateColor: [number, number, number, number?];
favoriteColor = [255, 153, 0, 0.5];
hateColor = [255, 255, 0];
枚舉型別(Enum Types)用來定義一組具名的常數集合,這些常數可以是數字或字串。枚舉型別提高了程式碼的可讀性和可維護性,因為每個值都是唯一且具名的。
特別的是枚舉型別(Enum Types)在編譯成 JavaScript 後,其實是一包物件,而且會自動生成數字索引給每個常數。
而如果要定義枚舉,則需要執行下列步驟:
實際來看一下最基礎的宣告範例:
enum Month {
Jan,
Feb,
Mar,
Apr,
May,
Jun,
Jul,
Aug,
Sep,
Oct,
Nov,
Dec
};
// 定義一個指定某幾個月份為夏天的函式
function isItSummer(month: Month) {
let isSummer: boolean;
switch (month) {
case Month.Jun:
case Month.Jul:
case Month.Aug:
isSummer = true;
break;
default:
isSummer = false;
break;
}
return isSummer;
}
// 可以實際測試某個月分是否為夏天
console.log(isItSummer(Month.Jun)); // true
這種枚舉應用之所以可以有效可讀性和可維護性,是因為如果今天改用數字枚舉去列出 1~12,那麼並無法清楚的知道它真實代表什麼,而使用月份的簡寫,更可清晰地辯讀。
{
'0': 'Jan',
'1': 'Feb',
'2': 'Mar',
'3': 'Apr',
'4': 'May',
'5': 'Jun',
'6': 'Jul',
'7': 'Aug',
'8': 'Sep',
'9': 'Oct',
'10': 'Nov',
'11': 'Dec',
Jan: 0,
Feb: 1,
Mar: 2,
Apr: 3,
May: 4,
Jun: 5,
Jul: 6,
Aug: 7,
Sep: 8,
Oct: 9,
Nov: 10,
Dec: 11
}
而我們可以善用這個數字索引來實際測試輸入索引值數字,而不是輸入我們先前定義好的常數:
console.log(isItSummer(1)); // true
對,沒錯!它可以正常運行!雖然我沒定義它,但因為以上原理它自動產生,並轉換為 value,所以當我將數字當作參數傳入 function,還是可以運行。
當然,以我們常規的了解,會覺得不對阿,我們的月份式從1月開始,而不是索引值的起始點0,這會讓對應上出了問題,明明 Jan 是代表1月,可是因為索引從0開始,全部都亂了套。
但這是有方式可以破解的,只要在第一個常數後面指定它的值為1即可:
enum Month {
Jan = 1,
Feb,
Mar,
Apr,
May,
Jun,
Jul,
Aug,
Sep,
Oct,
Nov,
Dec
};
宣告完成後,再打印一次結果確認,會發現順利對應上了:
{
'1': 'Jan',
'2': 'Feb',
'3': 'Mar',
'4': 'Apr',
'5': 'May',
'6': 'Jun',
'7': 'Jul',
'8': 'Aug',
'9': 'Sep',
'10': 'Oct',
'11': 'Nov',
'12': 'Dec',
Jan: 1,
Feb: 2,
Mar: 3,
Apr: 4,
May: 5,
Jun: 6,
Jul: 7,
Aug: 8,
Sep: 9,
Oct: 10,
Nov: 11,
Dec: 12
}
擴充型別如元組和枚舉提供了強大的工具來更精確地描述資料結構,從而提升了程式碼的可讀性和可維護性。掌握這些進階型別後,能夠應對更多複雜的情境,進一步提高開發效率。
參考資源:
TypeScript Enum