banner
沈青川

旧巷馆子

愿我如长风,渡君行万里。
twitter
jike

在使用 Array.filter 时,可以巧妙地利用自定义类型断言。

如果你是一個 TypeScript 常用者,你可能經歷過如下這樣的場景:

你有一個陣列,類型只有一部分欄位是確定的,需要在遍歷時操作每個元素,僅能通過某種自定義邏輯的判斷確定該元素的實際類型。

而當你想只需一串調用就能得到結果、同時又想要從中篩選出某種子類型的元素,常常會寫出這樣的程式碼:

上面這樣使用看起來非常主觀的斷言其實沒什麼不對,我們當然可以這樣用,但對 "filter 後的斷言" 這件事來說還有更好的解法。

問題的核心在於 .filter 的返回值好像仍然只能是個 Base[] 。而當你點開 .filter 這個方法的 TS 內建型別定義:

.filter 的型別定義

咦怎麼還有另一種?似乎可以給 .filter 這個方法傳入一個型別參數、或者在傳入 .filter 的實參函數的簽名部分顯式定義型別謂詞。TypeScript 的 “型別謂詞” 可以用來自定義型別斷言,因此我們可以這樣做:

根據程式碼應符合職責分工的規則,使用 .filter 的這一側應屬於業務邏輯,傳入的這個 predicate 函數是很獨立的 util,這個型別斷言函數可能複用多次,因此考慮將判斷函數抽出來:

最後我們看到的結果也非常簡潔、直觀和易讀。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。