日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

這個 TypeScript 技巧會讓你大吃一驚

來源: 責編: 時間:2024-05-11 09:18:06 175觀看
導讀從字符串數組中提取自定義類型在 TypeScript 的世界里,自定義類型從字符串數組中顯現,就像隱藏的寶石。TypeScript 是一個操縱現有數據和發展良好實踐的神奇工具。今天,我們將探索如何以正確的方式從字符串數組中提取全

從字符串數組中提取自定義類型

RLG28資訊網——每日最新資訊28at.com

在 TypeScript 的世界里,自定義類型從字符串數組中顯現,就像隱藏的寶石。RLG28資訊網——每日最新資訊28at.com

RLG28資訊網——每日最新資訊28at.com

TypeScript 是一個操縱現有數據和發展良好實踐的神奇工具。RLG28資訊網——每日最新資訊28at.com

今天,我們將探索如何以正確的方式從字符串數組中提取全名,以確保產生干凈的類型安全輸出。RLG28資訊網——每日最新資訊28at.com

那么,不多說了……讓我們直接開始吧。RLG28資訊網——每日最新資訊28at.com

RLG28資訊網——每日最新資訊28at.com

問題

首先讓我們通過檢查這段代碼來理解其中的問題:RLG28資訊網——每日最新資訊28at.com

const names = ["Daniel Craciun", "John Doe", "Harry Pigeon"]const findName = (surname: string) => {  return names.find((name) => name.includes(surname))}// 我們可以傳入任何字符串,這是不理想的。console.log(findName("Craciun")) // 輸出:Daniel Craciunconsole.log(findName("Doee")) // 輸出:undefined

這段代碼使用一個名字數組來進行搜索。RLG28資訊網——每日最新資訊28at.com

函數 findName 接受一個字符串 surname 并返回關聯的全名。RLG28資訊網——每日最新資訊28at.com

問題出現在當你在 findName 函數中輸入 "Doee" 時。RLG28資訊網——每日最新資訊28at.com

這個不顯眼的拼寫錯誤導致輸出了 undefined,這可能會導致后續的錯誤,因為沒有任何東西阻止我們犯這種錯誤。RLG28資訊網——每日最新資訊28at.com

這就是 TypeScript 發揮作用的地方。RLG28資訊網——每日最新資訊28at.com

如果我們確保 findName 只接受字面上的姓氏,即 Craciun、Doe、Pigeon,那么當我們輸入像 "Doee" 這樣在名字數組中不存在的輸入時,編譯器應該會提出警告。RLG28資訊網——每日最新資訊28at.com

解決方案

我們已經確定了 findName 的有效參數只能是所有現有的姓氏。RLG28資訊網——每日最新資訊28at.com

為了實現這一點,我們創建了一個名為 ExtractSurname 的泛型類型。RLG28資訊網——每日最新資訊28at.com

ExtractSurname 的代碼可能看起來有點復雜,但我們將一步步拆解它:RLG28資訊網——每日最新資訊28at.com

type ExtractSurname<T extends string> = T extends `${infer Firstname} ${infer Surname}` ? Surname : null

這里 ExtractSurname 接受一個泛型參數 T,它引用任何字面字符串,使用 extends 操作符。在 ExtractSurname<“Daniel”> 中,T 的值將等于 "Daniel"。RLG28資訊網——每日最新資訊28at.com

接下來我們應用 TypeScript 三元運算符,它類似于 JavaScript 三元運算符,但我們是在比較類型而不是實際數據。RLG28資訊網——每日最新資訊28at.com

我們知道我們的名字數組的格式是“<名> <姓>”,所以這里使用 infer 關鍵字從 T 中提取子類型。RLG28資訊網——每日最新資訊28at.com

在 ExtractSurname<“Daniel Craciun”> 中:RLG28資訊網——每日最新資訊28at.com

  • infer Firstname = “Daniel”
  • infer Surname = “Craciun”

最后,如果輸入滿足我們的“<名> <姓>”格式,返回 Surname 作為類型,否則返回 null。RLG28資訊網——每日最新資訊28at.com

好的,我們的 ExtractSurname 類型準備好了。RLG28資訊網——每日最新資訊28at.com

現在我們需要一個 Surname 類型來表示 names 中所有的姓氏。RLG28資訊網——每日最新資訊28at.com

type ExtractSurname<T extends string> = T extends `${infer Firstname} ${infer Surname}` ? Surname : nullconst names = ["Daniel Craciun", "John Doe", "Harry Pigeon"] as consttype Surname = ExtractSurname<(typeof names)[number]>

names 滿足 ExtractSurname 的格式 “*<名> <姓>*”。RLG28資訊網——每日最新資訊28at.com

我們使用 as const 將 names 的類型從字符串縮小到字面字符串數組。RLG28資訊網——每日最新資訊28at.com

這意味著我們轉換 names 的類型從 string 到:readonly [“Daniel Craciun”, “John Doe”, “Harry Pigeon”]。RLG28資訊網——每日最新資訊28at.com

參數 (typeof names)[number] 代表 names 中每個索引元素的類型:“Daniel Craciun” | “John Doe” | “Harry Pigeon”RLG28資訊網——每日最新資訊28at.com

最終,這是 Surname 的結果類型:type Surname = “Craciun” | “Doe” | “Pigeon”RLG28資訊網——每日最新資訊28at.com

最后一步是用下面的新函數 findNameUsingSurname 更新我們之前定義的 findName 函數:RLG28資訊網——每日最新資訊28at.com

// 接收一個實際的 `Surname` 而不是一般的字符串。const findNameUsingSurname = (surname: Surname) => {  // 注意:我們需要后綴運算符 "!" 來斷言 "find" 函數不返回未定義的值。  return names.find((name) => name.includes(surname))!}// 唯一可接受的輸入:"Craciun", "Doe", "Pigeon" = 最大類型安全const fullName = findNameUsingSurname("Craciun")// 輸出:"Daniel Craciun"console.log(fullName)

而這里是 TypeScript 編譯器如我們所期待的那樣施展它的魔法:RLG28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87964-0.html這個 TypeScript 技巧會讓你大吃一驚

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 拋棄自回歸,連接一致性Diffusion和LLM!UCSD上交新作熱度緊追AF 3

下一篇: Python for循環如何更加Pythonic

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 义乌市| 中宁县| 万山特区| 山丹县| 万全县| 临清市| 托克逊县| 文水县| 东莞市| 曲松县| 疏附县| 虎林市| 分宜县| 台东县| 萨迦县| 通化市| 台东市| 澄江县| 祁连县| 塘沽区| 韶关市| 博乐市| 宁国市| 商河县| 社旗县| 柳州市| 桐梓县| 七台河市| 云和县| 镶黄旗| 沛县| 双城市| 温泉县| 叙永县| 德清县| 丹棱县| 临朐县| 开阳县| 神农架林区| 蓝山县| 巨鹿县|