iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0

今天要來介紹 Discriminated Union、Type casting、Index properties。

Discriminated Union 可以為 Union 型別做出更多的判斷,針對不同的物件可以賦予一個同樣名稱的屬性,然後給予不同的值來辨別各個物件:

interface Bicycle {
  type: 'bicycle';
  bicycleSpeed: number;
}

interface Motobike {
  type: 'motobike';
  motobikeSpeed: number;
}

type Transportation = Bicycle | Motobike;

function moveTransportation(transpotation: Transportation) {
  let speed;
  switch (transpotation.type) {
    case 'bicycle':
      speed = transpotation.bicycleSpeed;
      break;
    case 'motobike':
      speed = transpotation.motobikeSpeed;
  }
  console.log('Moving at speed: ' + speed);
}

這邊看到在兩個 interface 都定義了 type,這樣就能夠更準確的在 function 定義要使用那一個 interface,除了用 switch 判斷之外也能用 if 來判斷。

Type casting 會用在選取 DOM 物件上面,比如說當選取了 Input 物件時,TypeScript 沒辦法辨別它是 Input 物件,只會單純的認為它是一個 HTML 的 element,這時如果想要為 Input 設置 value 的時候就會報錯,因為 TypeScript 不確定它有沒有 value 這個屬性:
https://ithelp.ithome.com.tw/upload/images/20210923/20131989dygk6XVD1H.png

這時候就能夠使用 Type casting 來告訴 TypeScript 選取的 DOM 物件到底是什麼東西,有兩種寫法,分別是使用 <> 以及 as 關鍵字:
https://ithelp.ithome.com.tw/upload/images/20210923/201319891APKkzwYc2.png
https://ithelp.ithome.com.tw/upload/images/20210923/20131989MhvOahIvRB.png

Index properties 是在基於 TypeScript 的規則上能夠寫出更加彈性的程式碼,通常運用在定義物件上:

interface ErrorContainer { // { email: 'Not a valid email', username: 'Must start with a character!' }
  [prop: string]: string;
}

const errorBag: ErrorContainer = {
  email: 'Not a valid email!',
  username: 'Must start with a capital character!'
}

如果不確定物件屬性的數量,但是已經預知它 key value 的結構會一致,那就可以使用上面的方式分別定義 key 的型別以及 value 的型別,這樣在定義物件時,就可以不限制屬性的數量來增加或刪除了。

今天的學習筆記就到這邊,感謝閱讀。:)


上一篇
Day 8 進階型別 - Part 1
下一篇
Day 10 進階型別 Part - 3
系列文
TypeScript 三十天學習日記24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言