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

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

這個 TypeScript 技巧將讓你大開眼界

來源: 責編: 時間:2024-06-06 17:43:35 147觀看
導讀TypeScript 是一個了不起的工具,可以用來操縱現(xiàn)有數(shù)據(jù)并開發(fā)出優(yōu)秀的實踐方法。今天我們將探索如何從字符串數(shù)組中正確提取全名,以確保輸出的類型安全和干凈。問題我們檢查一下這段代碼并理解它的問題:const names = ["D

gqu28資訊網(wǎng)——每日最新資訊28at.com

TypeScript 是一個了不起的工具,可以用來操縱現(xiàn)有數(shù)據(jù)并開發(fā)出優(yōu)秀的實踐方法。gqu28資訊網(wǎng)——每日最新資訊28at.com

今天我們將探索如何從字符串數(shù)組中正確提取全名,以確保輸出的類型安全和干凈。gqu28資訊網(wǎng)——每日最新資訊28at.com

問題

我們檢查一下這段代碼并理解它的問題:gqu28資訊網(wǎng)——每日最新資訊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

這段代碼使用了一個名字數(shù)組進行搜索。findName 函數(shù)接受一個姓氏字符串并返回相關(guān)的全名。問題在于當你輸入 "Doee" 進 findName 函數(shù)時會出現(xiàn)。gqu28資訊網(wǎng)——每日最新資訊28at.com

這個不起眼的拼寫錯誤會導致 undefined 輸出,這可能會在后續(xù)導致錯誤,因為沒有任何機制阻止我們犯這個錯誤。gqu28資訊網(wǎng)——每日最新資訊28at.com

這時 TypeScript 就派上用場了。gqu28資訊網(wǎng)——每日最新資訊28at.com

如果我們確保 findName 只接受字面的姓氏,即 Craciun, Doe, Pigeon,那么當我們輸入 names 數(shù)組中不存在的輸入(如 "Doee")時,編譯器就會報警。gqu28資訊網(wǎng)——每日最新資訊28at.com

解決方案

我們已經(jīng)確定,findName 的有效參數(shù)需要包含所有現(xiàn)有的姓氏。為了實現(xiàn)這一點,我們創(chuàng)建一個名為 ExtractSurname 的泛型類型。gqu28資訊網(wǎng)——每日最新資訊28at.com

ExtractSurname 的代碼可能看起來很復雜,但我們將逐步解析它:gqu28資訊網(wǎng)——每日最新資訊28at.com

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

這里 ExtractSurname 接受一個泛型參數(shù) T,該參數(shù)使用 extends 操作符指的是任何字面字符串。gqu28資訊網(wǎng)——每日最新資訊28at.com

在 ExtractSurname<"Daniel"> 中,T 的值等于 "Daniel"。gqu28資訊網(wǎng)——每日最新資訊28at.com

接下來我們應用 TypeScript 的三元操作符,這類似于 JavaScript 的三元操作符,但我們比較的是類型而不是實際數(shù)據(jù)。gqu28資訊網(wǎng)——每日最新資訊28at.com

我們知道 names 數(shù)組的格式是 “<Name> <Surname>”,所以這里的 infer 關(guān)鍵字從 T 中提取子類型。gqu28資訊網(wǎng)——每日最新資訊28at.com

在ExtractSurname<"Daniel Craciun">中:gqu28資訊網(wǎng)——每日最新資訊28at.com

infer Firstname = "Daniel"infer Surname = "Craciun"

最后,如果輸入滿足我們的 “” 格式,則返回姓氏作為類型,否則返回 nullgqu28資訊網(wǎng)——每日最新資訊28at.com

好了,我們的 ExtractSurname 類型已經(jīng)準備好了。gqu28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在我們需要一個 Surname 類型來表示 names 中的所有姓氏。gqu28資訊網(wǎng)——每日最新資訊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 的 “<Name> <Surname>” 格式。gqu28資訊網(wǎng)——每日最新資訊28at.com

我們使用 as const 將 names 的類型縮小為字面字符串數(shù)組。這意味著我們將 names 的類型從 string 強制轉(zhuǎn)換為:gqu28資訊網(wǎng)——每日最新資訊28at.com

readonly ["Daniel Craciun", "John Doe", "Harry Pigeon"]

參數(shù) (typeof names)[number] 表示 names 中每個索引元素的類型:gqu28資訊網(wǎng)——每日最新資訊28at.com

"Daniel Craciun" | "John Doe" | "Harry Pigeon"

最后,這是 Surname 的結(jié)果類型:gqu28資訊網(wǎng)——每日最新資訊28at.com

type of Surname: "Craciun" | "Doe" | "Pigeon"

最后一步是更新我們之前定義的 findName 函數(shù),用一個新的 findNameUsingSurname 函數(shù),如下所示:gqu28資訊網(wǎng)——每日最新資訊28at.com

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

這就是我們預期的 TypeScript 編譯器的魔法:gqu28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論

TypeScript 是一個強大的工具,可以確保代碼的類型安全性。通過使用 ExtractSurname 類型,我們能夠確保 findName 函數(shù)只接受有效的姓氏,從而避免拼寫錯誤和潛在的運行時錯誤。這個技巧不僅提高了代碼的安全性,還增強了開發(fā)效率。希望你能在項目中嘗試這個技巧,并體驗它帶來的便利和強大功能。gqu28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-92478-0.html這個 TypeScript 技巧將讓你大開眼界

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

上一篇: 通過Spring Boot結(jié)合實時流媒體技術(shù)對考試過程進行實時監(jiān)控

下一篇: 前端生成海報圖技術(shù)選型與問題解決

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 夏河县| 太康县| 襄垣县| 遵化市| 高雄县| 黑河市| 鹿邑县| 乐安县| 海丰县| 云和县| 通山县| 屏边| 威远县| 天柱县| 泸溪县| 正镶白旗| 北川| 广东省| 习水县| 安远县| 香港| 东山县| 洛宁县| 奎屯市| 天台县| 醴陵市| 格尔木市| 新安县| 界首市| 灵宝市| 罗甸县| 镇巴县| 蒙自县| 秭归县| 卢氏县| 汉沽区| 威远县| 平潭县| 丰镇市| 嘉峪关市| 克东县|