iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
自我挑戰組

TypeScript 能手養成之旅系列 第 13

TypeScript 能手養成之旅 Day 13 特殊型別 - Never

前言

今天來講解特殊型別中的 nevernever 是一種函式回傳值的狀況,跟 void 很像,稍後會來比較一下兩者的差異。

Never 型別的意義

有兩種情況會派上用場:

  1. 當函式或方法永遠不回傳值(例如:無窮迴圈)。
  2. 出現例外狀況導致程序無法繼續執行。

如果今天有一個函式會有回傳值,而中間我們有準備例外處理拋出來,我們就可以將這個函式回傳值賦予 Never 型別,如下:

const transactionCheck = function orderStatusCheck(status: string): string | never {
  if (status === 'cancel') {
    errorMessage('something went wrong')
  }

  return 'seccess!'
}

function errorMessage(message: string): never {
  throw new Error(message);
}

這邊 TypeScript 很聰明的推斷 errorMessagenever

另外整理 never 例子

// 有特別註記 never
function errorMessage(message: string): never {
  throw new Error(message);
}

// 自動推論回傳的是 never 
function failed() {
  return errorMessage('errorMessage')
}

// getRandomFail 函式會有結束點(number 小於 2),回報錯誤
function getRandomFail(x: number): never{
  let number = Math.floor(Math.random() * x) + 1
  if (number < 2) {
    failed() 
  }
} //Error: A function returning 'never' cannot have a reachable end point.

never v.s. void 的差異

void: 函式或方法不回傳值的情況。
never: 函式沒有任何結束點時,若沒有註記,TypeScript 就會判斷該函式回傳值為 never。如果有註記回傳值為 never,該函式就不會有結束點。

結語

這邊簡單複習一下:

  1. 當函式沒有結束點時,TypeScript 會自動幫我們推斷回傳值為 never
  2. 有註記該函式回傳值為 never 時,代表這函式不會有結束點。
  3. 如果回傳值有其他型別可能,可以搭配 never 服用。
  4. 函式沒有註記回傳值型別,TypeScript 會根據 return 值的型別或函式回傳值來進行型別推斷。

never 是蠻特殊的型別,也有好玩的地方,大家可以多多嘗試喔~


上一篇
TypeScript 能手養成之旅 Day 12 泛用型別(Generics Types)
下一篇
TypeScript 能手養成之旅 Day 14 特殊型別(2) - Any & Unknown
系列文
TypeScript 能手養成之旅16

尚未有邦友留言

立即登入留言