今天來聊聊我也不太熟悉的TypeScript概念:
Tuple(元組)(不是那個雪餅) 跟 Enum 列舉。
Tuple並不是JavaScript原生的概念,是TypeScript提供的一種資料結構,所以如果你之前是只學過JavaScript的人,應該會對Tuple很陌生。
Tuple是“長度固定的陣列”,其中每個element都可以是不同的型別,但順序必須固定,馬上來看一個例子:
let person: [string, number];
person = ["John", 18]
//[string, number]這就是元組的樣子,你可以決定他要多長(有幾個值),但長度得固定。
我們宣告了一個變數person
,將其設定為陣列,其第一個索引值必須為string
、第二個索引值必須為number
。若我們反過來將第一個索引值設定為number
,TypeScript會毫不猶豫地報錯。所以元組非常適用應用在“資料具關聯性且有順序關係”的陣列中。
比方說,我們可以對函式的參數使用rest operator(...
):
function sayHi(...arg:[string, number]){
//略
//就能確定要傳進此函式的第一第二個參數的型別為何
}
大致上會等於下面的狀況
function sayHi(arg1: string, arg2: number){
//略
}
(既然可以使用rest operator,當然也可以用在spread operator囉。)
另外,我們也可以為元組加上label,提高程式碼的閱讀性。
let person: [name: string, age: number];
//應該有比先前更好讀一些...吧
person = ["John",18]
列舉應該是少數在TypeScript中,跟型別比較沒關係的一個概念。
他大意是要讓我們用一個名稱來指涉一系列特定名稱的常數值(超饒口我知道),跟Tuple一樣都不是JavaScript的基本型別,只是TypeScript的衍生功能。
我們可以用關鍵字enum
來宣告一個列舉:
enum Direction {
Up = 1,
Down,
Left,
Right
}
//enum 後面的名稱即為列舉名稱(上面是Direction),名稱後大括號curly braces內的即為列舉值
這邊我們將Direction
內的Up
起始值設定為1,而後面的Down Left Right
會依序遞增為2 3 4
。若我們這邊不將Up
設一個起始值,則預設會從0
開始,跟陣列的索引相同。所以這邊你應該就會注意到,他本質上就是JavaScript的number
,只是我們有給他英文名稱,所以在可讀性上會提升一些(前提是你懂TypeScript啦,不然看了一定更霧煞煞)。
enum Direction {
Up = 1,
Down,
Left,
Right
}
const array: [Direction, string] = [Direction.Up, "A"]
console.log(typeof array[0], array[0])
//"number", 1
我們也可以在列舉值的中間打斷他的順序,像這樣:
enum Direction {
Up,
Down = 20,
Left,
Right
}
const array: Direction[] = [Direction.Up, Direction.Down, Direction.Left, Direction.Right]
console.log(array)
//0, 20, 21, 22
我們也可以將值從數字改成字串,如此在後續debug或看log時會更清楚一些,但改成字串後,你就必須對"每一個"列舉元素都提供一個值,畢竟變成字串後,對字串進行遞增,意義...不大:
enum City {
Taipei = "Taipei",
Taoyuan = "Taoyuan"
}
console.log(City.Taipei)
//"Taipei"
console.log(City.Taoyuan)
//"Taoyuan"
小結:
不曉得看到這邊,會不會覺得這些屬性、這些概念很模糊?或者覺得很雞肋,不太有意義?我目前對這兩個概念的理解也不深,所以之後會再找實際的例子來說明他們好用的地方在哪,今天就先有個大概概念就好。