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

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

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

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

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

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

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

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

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

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

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

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

問題

首先讓我們通過檢查這段代碼來理解其中的問題:mSs28資訊網——每日最新資訊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

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

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

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

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

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

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

解決方案

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

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

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

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

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

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

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

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

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

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

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

現在我們需要一個 Surname 類型來表示 names 中所有的姓氏。mSs28資訊網——每日最新資訊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 的格式 “*<名> <姓>*”。mSs28資訊網——每日最新資訊28at.com

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

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

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

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

最后一步是用下面的新函數 findNameUsingSurname 更新我們之前定義的 findName 函數:mSs28資訊網——每日最新資訊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 編譯器如我們所期待的那樣施展它的魔法:mSs28資訊網——每日最新資訊28at.com

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

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

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

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

標簽:
  • 熱門焦點
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 微軟邀請 Microsoft 365 商業用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、&ldquo;Ringdoll戒之人形&rdquo;淘寶店鋪有關外貌的評價,黃山已經聽累了。生于1985年的他,哪
  • 聯想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據有人爆料,聯想的下一款 ThinkBook Plus 可能更特殊,它
  • 微軟發布Windows 11新版 引入全新任務欄狀態

    近日,微軟發布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統更流暢了。更新中,Windows 11加入了專門針對平板優化的任務欄
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top 主站蜘蛛池模板: 衡南县| 富川| 无为县| 南皮县| 阳西县| 阜新市| 文山县| 扬中市| 岑巩县| 永平县| 伊春市| 宣威市| 二手房| 孝昌县| 寻乌县| 栾城县| 华坪县| 崇信县| 广汉市| 内江市| 东光县| 平阴县| 岳阳市| 河南省| 北辰区| 大港区| 乌兰浩特市| 浦县| 桐庐县| 鸡西市| 裕民县| 安溪县| 汤阴县| 城步| 百色市| 车致| 金沙县| 乐山市| 新闻| 江孜县| 育儿|