当前位置:首页 > 科技  > 软件

这个 TypeScript 技巧将让你大开眼界

来源: 责编: 时间:2024-06-06 17:43:35 90观看
导读TypeScript 是一个了不起的工具,可以用来操纵现有数据并开发出优秀的实践方法。今天我们将探索如何从字符串数组中正确提取全名,以确保输出的类型安全和干净。问题我们检查一下这段代码并理解它的问题:const names = ["D

1Qe28资讯网——每日最新资讯28at.com

TypeScript 是一个了不起的工具,可以用来操纵现有数据并开发出优秀的实践方法。1Qe28资讯网——每日最新资讯28at.com

今天我们将探索如何从字符串数组中正确提取全名,以确保输出的类型安全和干净。1Qe28资讯网——每日最新资讯28at.com

问题

我们检查一下这段代码并理解它的问题:1Qe28资讯网——每日最新资讯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

这段代码使用了一个名字数组进行搜索。findName 函数接受一个姓氏字符串并返回相关的全名。问题在于当你输入 "Doee" 进 findName 函数时会出现。1Qe28资讯网——每日最新资讯28at.com

这个不起眼的拼写错误会导致 undefined 输出,这可能会在后续导致错误,因为没有任何机制阻止我们犯这个错误。1Qe28资讯网——每日最新资讯28at.com

这时 TypeScript 就派上用场了。1Qe28资讯网——每日最新资讯28at.com

如果我们确保 findName 只接受字面的姓氏,即 Craciun, Doe, Pigeon,那么当我们输入 names 数组中不存在的输入(如 "Doee")时,编译器就会报警。1Qe28资讯网——每日最新资讯28at.com

解决方案

我们已经确定,findName 的有效参数需要包含所有现有的姓氏。为了实现这一点,我们创建一个名为 ExtractSurname 的泛型类型。1Qe28资讯网——每日最新资讯28at.com

ExtractSurname 的代码可能看起来很复杂,但我们将逐步解析它:1Qe28资讯网——每日最新资讯28at.com

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

这里 ExtractSurname 接受一个泛型参数 T,该参数使用 extends 操作符指的是任何字面字符串。1Qe28资讯网——每日最新资讯28at.com

在 ExtractSurname<"Daniel"> 中,T 的值等于 "Daniel"。1Qe28资讯网——每日最新资讯28at.com

接下来我们应用 TypeScript 的三元操作符,这类似于 JavaScript 的三元操作符,但我们比较的是类型而不是实际数据。1Qe28资讯网——每日最新资讯28at.com

我们知道 names 数组的格式是 “<Name> <Surname>”,所以这里的 infer 关键字从 T 中提取子类型。1Qe28资讯网——每日最新资讯28at.com

在ExtractSurname<"Daniel Craciun">中:1Qe28资讯网——每日最新资讯28at.com

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

最后,如果输入满足我们的 “” 格式,则返回姓氏作为类型,否则返回 null1Qe28资讯网——每日最新资讯28at.com

好了,我们的 ExtractSurname 类型已经准备好了。1Qe28资讯网——每日最新资讯28at.com

现在我们需要一个 Surname 类型来表示 names 中的所有姓氏。1Qe28资讯网——每日最新资讯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>” 格式。1Qe28资讯网——每日最新资讯28at.com

我们使用 as const 将 names 的类型缩小为字面字符串数组。这意味着我们将 names 的类型从 string 强制转换为:1Qe28资讯网——每日最新资讯28at.com

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

参数 (typeof names)[number] 表示 names 中每个索引元素的类型:1Qe28资讯网——每日最新资讯28at.com

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

最后,这是 Surname 的结果类型:1Qe28资讯网——每日最新资讯28at.com

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

最后一步是更新我们之前定义的 findName 函数,用一个新的 findNameUsingSurname 函数,如下所示:1Qe28资讯网——每日最新资讯28at.com

// 接受实际的 `Surname` 而不是一般的字符串。const findNameUsingSurname = (surname: Surname) => {  // 注意:我们需要后缀操作符 "!" 来断言 `find` 函数不会返回 undefined 值。  return names.find((name) => name.includes(surname))!}// 唯一可接受的输入:"Craciun", "Doe", "Pigeon" = 最大类型安全const fullName = findNameUsingSurname("Craciun")// 输出: "Daniel Craciun"console.log(fullName)

这就是我们预期的 TypeScript 编译器的魔法:1Qe28资讯网——每日最新资讯28at.com

结论

TypeScript 是一个强大的工具,可以确保代码的类型安全性。通过使用 ExtractSurname 类型,我们能够确保 findName 函数只接受有效的姓氏,从而避免拼写错误和潜在的运行时错误。这个技巧不仅提高了代码的安全性,还增强了开发效率。希望你能在项目中尝试这个技巧,并体验它带来的便利和强大功能。1Qe28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-92478-0.html这个 TypeScript 技巧将让你大开眼界

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 通过Spring Boot结合实时流媒体技术对考试过程进行实时监控

下一篇: 前端生成海报图技术选型与问题解决

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • Raft算法:保障分布式系统共识的稳健之道

    Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 学习JavaScript的10个理由...

    学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
Top
Baidu
map