TS – Defensive Function

防禦型函式 Defensive Function

一種源自於防禦性程式設計(Defensive Programming)的寫法,簡單來說就是「我不信任任何外部輸入的資料,一定會有人搞砸(例如忘記設定環境變數),所以我要在最前端築起一道防護牆。」

無防禦性寫法

function getEnv(name: string) {
  return process.env[name]; // 拿了就直接丟回去,不管有沒有拿到
}Code language: JavaScript (javascript)

如果開發的人忘記在 .env 設定 DB_PASSWORD,就會因爲收到 undefined最後噴出一個 Access denied for user 'root'@'localhost' (using password: NO)

有防禦的寫法

function getRequiredEnv(name: string): string {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Missing required env: ${name}`); // 自定義錯誤訊息
  }
  return value;
}Code language: JavaScript (javascript)

如果漏掉任何一個設定,程式在啟動就會馬上告訴你:Missing required env: DB_PASSWORD


保證回傳

參考以下程式碼:

function func(value: string): string {
  return value;
}Code language: JavaScript (javascript)

爲什麼要func()右邊還要寫一個:string呢,這叫做保證回傳型別
有在寫TS的人應該都對這個錯誤不陌生:

Argument of type ‘string | undefined’ is not assignable to parameter of type ‘string’.

如果你沒有保證回傳一定是字串,TypeScript 就會跟你說變數可能是 string 也可能是 undefined,于是拒絕編譯導致錯誤。