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

这个 TypeScript 技巧会让你大吃一惊

来源: 责编: 时间:2024-05-11 09:18:06 96观看
导读从字符串数组中提取自定义类型在 TypeScript 的世界里,自定义类型从字符串数组中显现,就像隐藏的宝石。TypeScript 是一个操纵现有数据和发展良好实践的神奇工具。今天,我们将探索如何以正确的方式从字符串数组中提取全

从字符串数组中提取自定义类型

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

在 TypeScript 的世界里,自定义类型从字符串数组中显现,就像隐藏的宝石。OtM28资讯网——每日最新资讯28at.com

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

TypeScript 是一个操纵现有数据和发展良好实践的神奇工具。OtM28资讯网——每日最新资讯28at.com

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

那么,不多说了……让我们直接开始吧。OtM28资讯网——每日最新资讯28at.com

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

问题

首先让我们通过检查这段代码来理解其中的问题:OtM28资讯网——每日最新资讯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

这段代码使用一个名字数组来进行搜索。OtM28资讯网——每日最新资讯28at.com

函数 findName 接受一个字符串 surname 并返回关联的全名。OtM28资讯网——每日最新资讯28at.com

问题出现在当你在 findName 函数中输入 "Doee" 时。OtM28资讯网——每日最新资讯28at.com

这个不显眼的拼写错误导致输出了 undefined,这可能会导致后续的错误,因为没有任何东西阻止我们犯这种错误。OtM28资讯网——每日最新资讯28at.com

这就是 TypeScript 发挥作用的地方。OtM28资讯网——每日最新资讯28at.com

如果我们确保 findName 只接受字面上的姓氏,即 Craciun、Doe、Pigeon,那么当我们输入像 "Doee" 这样在名字数组中不存在的输入时,编译器应该会提出警告。OtM28资讯网——每日最新资讯28at.com

解决方案

我们已经确定了 findName 的有效参数只能是所有现有的姓氏。OtM28资讯网——每日最新资讯28at.com

为了实现这一点,我们创建了一个名为 ExtractSurname 的泛型类型。OtM28资讯网——每日最新资讯28at.com

ExtractSurname 的代码可能看起来有点复杂,但我们将一步步拆解它:OtM28资讯网——每日最新资讯28at.com

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

这里 ExtractSurname 接受一个泛型参数 T,它引用任何字面字符串,使用 extends 操作符。在 ExtractSurname<“Daniel”> 中,T 的值将等于 "Daniel"。OtM28资讯网——每日最新资讯28at.com

接下来我们应用 TypeScript 三元运算符,它类似于 JavaScript 三元运算符,但我们是在比较类型而不是实际数据。OtM28资讯网——每日最新资讯28at.com

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

在 ExtractSurname<“Daniel Craciun”> 中:OtM28资讯网——每日最新资讯28at.com

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

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

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

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

我们使用 as const 将 names 的类型从字符串缩小到字面字符串数组。OtM28资讯网——每日最新资讯28at.com

这意味着我们转换 names 的类型从 string 到:readonly [“Daniel Craciun”, “John Doe”, “Harry Pigeon”]。OtM28资讯网——每日最新资讯28at.com

参数 (typeof names)[number] 代表 names 中每个索引元素的类型:“Daniel Craciun” | “John Doe” | “Harry Pigeon”OtM28资讯网——每日最新资讯28at.com

最终,这是 Surname 的结果类型:type Surname = “Craciun” | “Doe” | “Pigeon”OtM28资讯网——每日最新资讯28at.com

最后一步是用下面的新函数 findNameUsingSurname 更新我们之前定义的 findName 函数:OtM28资讯网——每日最新资讯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 编译器如我们所期待的那样施展它的魔法:OtM28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87964-0.html这个 TypeScript 技巧会让你大吃一惊

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

上一篇: 抛弃自回归,连接一致性Diffusion和LLM!UCSD上交新作热度紧追AF 3

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

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • Raft算法:保障分布式系统共识的稳健之道

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

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 三言两语说透柯里化和反柯里化

    三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 这款新兴工具平台,让你的电脑效率翻倍

    这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
Top