首頁  >  文章  >  web前端  >  # 用可重複使用函數取代通用驗證

# 用可重複使用函數取代通用驗證

王林
王林原創
2024-09-03 14:35:08691瀏覽

# Replace Generic Validation with Reusable Functions

JavaScript 和 TypeScript 開發人員經常發現自己重複編寫相同的條件。如果您是 Web 開發人員,您可能曾經遇到以下程式碼:

const handleSaveTextKeydown = (event: KeyboardEvent) => {
   if (event.key === 'Enter') {
    //... save text
   }
}

在這種情況下,event.key 是字串類型,例如,如果不小心在「Enter」中包含空格,很容易引入錯誤。

為什麼不將這個條件封裝在一個函數中?

const handleSaveTextKeydown = (event: KeyboardEvent) => {
   if (checkIsEnterKey(event.key)) {
    //... save text
   }
}

這確保了對 Enter 鍵的所有檢查都是一致且可靠的。

現在,考慮這個驗證:

type Value = null | object;

const value = {} as Value;

if (typeof value === 'object') {
  value; // value type is null | object
}

儘管 TypeScript 很智能,但條件內的值仍然是 Value 型別。這是因為 typeof null 傳回「object」。

所以,你需要寫:

if (value !== null && typeof value === 'object') {
  value; // value type is object
}

很多開發者遇到這種情況可能不會將其封裝成函數,而是重複編寫。

你一生中寫過多少次同樣的情況?

你犯過多少次同樣的錯誤?

同樣的條件你以後還會寫幾次?

如果是我,我會這樣做:

if (checkIsObject(value)) {
  value; // value type is object
}

將通用條件封裝在函數中有很多好處。

考慮以下範例:

const array = [0, 1, 2, 3, 4, 5, null, undefined];

讓我們建立一個僅排除空值的陣列。

您可以優先考慮簡潔性並這樣寫:

const numbers = array.filter(Boolean);

不幸的是,這並不理想。 0 也被評估為 false 並被排除。所以你需要寫:

const numbers = array.filter(item => item !== null && item !== undefined);

這不是感覺很醜陋、不可重用的程式碼嗎?

我可以寫出更優雅的程式碼​​:

const numbers = array.filter(checkIsNullish);

停止重複編寫通用條件。它只會導致錯誤,並且程式碼的可讀性會降低。

讓我介紹一下我創建的一個名為 checker 的庫。

這個實用函數庫將一般 Web 開發和低階開發中常用的條件表示為函數。所有函數都接受輸入並傳回布林值。

在撰寫本文時,它提供了豐富的函數來處理字串、數字、布林值和空值等資料類型。所有功能都經過測試、記錄,並且易於開始使用。

讓我們來看一些現實世界的例子。

該程式庫提供的套件全部發佈在JSR上。它們可以輕鬆安裝在 NPM、PNPM、Yarn、Bun 和 Deno 專案中。

這裡,我們以 NPM 的 @checker/string 套件為例。

  1. 安裝軟體套件

在專案目錄中執行以下命令:

  npx jsr add @checker/string
  1. 使用功能
  import { checkIsNotEmptyString, checkIsIndexFound } from "@checker/string";

  const value = "Hello";

  const formatted = value.trim();

  if (checkIsNotEmptyString(formatted)) {
    // formatted !== ''
    // When formatted is not an empty string
  }

  const index = value.indexOf("el");

  if (checkIsIndexFound(index)) {
    // index !== -1
    // When "el" is found in value
  }

我不喜歡使用像 !SOME_CONDITION 這樣的邏輯否定運算子來反轉布林值。這是因為它是隱式的,簡單地透過添加或省略它來反轉布林值可能會導致許多危險的情況。

因此,所有函數都定義了對應的 checkIsNot~ 函數。

將通用條件封裝在函數中。這樣,程式碼變得更具可讀性,錯誤也更容易發現。

感謝您的閱讀。

以上是# 用可重複使用函數取代通用驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn