iT邦幫忙

2022 iThome 鐵人賽

DAY 11
1

今天來聊聊我也不太熟悉的TypeScript概念:
Tuple(元組)(不是那個雪餅) 跟 Enum 列舉。

Tuple 元組

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]

Enum 列舉

列舉應該是少數在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"

小結:
不曉得看到這邊,會不會覺得這些屬性、這些概念很模糊?或者覺得很雞肋,不太有意義?我目前對這兩個概念的理解也不深,所以之後會再找實際的例子來說明他們好用的地方在哪,今天就先有個大概概念就好。


上一篇
第十天!來個回顧吧!
下一篇
第12天!你有發現我們一直在限縮型別嗎?
系列文
你也對開始使用typescript感到無力嗎?我也是 - 30天初探typescript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言