成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發
今天,我們將探索如何以正確的方式從字符串數組中提取全名,以確保產生干凈的類型安全輸出。

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

在 TypeScript 的世界里,自定義類型從字符串數組中顯現,就像隱藏的寶石。

TypeScript 是一個操縱現有數據和發展良好實踐的神奇工具。

今天,我們將探索如何以正確的方式從字符串數組中提取全名,以確保產生干凈的類型安全輸出。

那么,不多說了……讓我們直接開始吧。

問題

首先讓我們通過檢查這段代碼來理解其中的問題:

const names = ["Daniel Craciun", "John Doe", "Harry Pigeon"]

const findName = (surname: string) => {
  return names.find((name) => name.includes(surname))
}

// 我們可以傳入任何字符串,這是不理想的。

console.log(findName("Craciun")) // 輸出:Daniel Craciun
console.log(findName("Doee")) // 輸出:undefined

這段代碼使用一個名字數組來進行搜索。

函數 findName 接受一個字符串 surname 并返回關聯的全名。

問題出現在當你在 findName 函數中輸入 "Doee" 時。

這個不顯眼的拼寫錯誤導致輸出了 undefined,這可能會導致后續的錯誤,因為沒有任何東西阻止我們犯這種錯誤。

這就是 TypeScript 發揮作用的地方。

如果我們確保 findName 只接受字面上的姓氏,即 Craciun、Doe、Pigeon,那么當我們輸入像 "Doee" 這樣在名字數組中不存在的輸入時,編譯器應該會提出警告。

解決方案

我們已經確定了 findName 的有效參數只能是所有現有的姓氏。

為了實現這一點,我們創建了一個名為 ExtractSurname 的泛型類型。

ExtractSurname 的代碼可能看起來有點復雜,但我們將一步步拆解它:

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

這里 ExtractSurname 接受一個泛型參數 T,它引用任何字面字符串,使用 extends 操作符。在 ExtractSurname<“Daniel”> 中,T 的值將等于 "Daniel"。

接下來我們應用 TypeScript 三元運算符,它類似于 JavaScript 三元運算符,但我們是在比較類型而不是實際數據。

我們知道我們的名字數組的格式是“<名> <姓>”,所以這里使用 infer 關鍵字從 T 中提取子類型。

在 ExtractSurname<“Daniel Craciun”> 中:

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

最后,如果輸入滿足我們的“<名> <姓>”格式,返回 Surname 作為類型,否則返回 null。

好的,我們的 ExtractSurname 類型準備好了。

現在我們需要一個 Surname 類型來表示 names 中所有的姓氏。

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

const names = ["Daniel Craciun", "John Doe", "Harry Pigeon"] as const
type Surname = ExtractSurname<(typeof names)[number]>

names 滿足 ExtractSurname 的格式 “*<名> <姓>*”。

我們使用 as const 將 names 的類型從字符串縮小到字面字符串數組。

這意味著我們轉換 names 的類型從 string 到:readonly [“Daniel Craciun”, “John Doe”, “Harry Pigeon”]。

參數 (typeof names)[number] 代表 names 中每個索引元素的類型:“Daniel Craciun” | “John Doe” | “Harry Pigeon”

最終,這是 Surname 的結果類型:type Surname = “Craciun” | “Doe” | “Pigeon”

最后一步是用下面的新函數 findNameUsingSurname 更新我們之前定義的 findName 函數:

// 接收一個實際的 `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 編譯器如我們所期待的那樣施展它的魔法:

責任編輯:趙寧寧 來源: 技術的游戲
相關推薦

2022-07-08 09:53:51

JavaScript單行代碼

2022-07-12 10:18:05

JavaScript單行代碼

2020-09-10 09:39:56

大數據大數據統計數據

2011-03-29 09:34:38

APP應用程序LBS

2021-09-27 11:13:12

比特幣加密貨幣貨幣

2021-06-11 13:20:41

Vivaldi 4.0Linux瀏覽器

2024-04-03 14:17:47

VR虛擬現實增強現實

2019-03-15 16:16:15

蘋果ARVR

2024-10-29 08:30:29

2023-10-06 12:48:00

數據訓練

2023-10-08 14:35:08

2024-04-22 14:36:14

2016-11-21 17:58:38

大數據安全合規

2009-05-20 10:26:09

Visual StudWF微軟

2010-07-07 09:34:44

服務器

2021-05-10 15:11:58

人工智能大數據科技

2015-02-11 10:21:07

JavaScript

2021-04-15 10:30:47

工具代碼開發

2010-11-29 15:35:36

云計算經濟學

2013-01-31 09:26:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线日韩中文字幕 | 亚洲欧美视频一区 | 日韩欧美网 | 亚洲成人免费av | 日韩欧美国产一区二区三区 | 国产精品视频网 | 黄色骚片 | 午夜影院在线免费观看视频 | 国产精品亚洲精品日韩已方 | av手机在线播放 | 中文字幕亚洲区一区二 | 日本三级在线 | 在线播放第一页 | 色婷婷av99xx | 日韩在线免费 | 国产精品美女久久久久久免费 | 精品久久精品 | 久久精品亚洲国产奇米99 | 欧美操操操 | 精品99久久久久久 | 免费人成激情视频在线观看冫 | 午夜视频免费网站 | 国产美女精品 | 日本人做爰大片免费观看一老师 | 高清视频一区二区三区 | 天天爽网站 | 色视频在线观看 | av官网在线| 国产精品1 | 超碰人人人 | 国产高清精品一区二区三区 | 欧美黑人体内she精在线观看 | 日韩电影免费在线观看中文字幕 | 成人做爰69片免费观看 | 日韩在线免费视频 | 在线资源视频 | 久久久久久久久久久一区二区 | 91精品国产综合久久香蕉麻豆 | 欧美极品在线播放 | 国产精品视频一区二区三区四蜜臂 | 天天躁日日躁狠狠很躁 |