🎖️typeScrpt中如何从验证字符串?

简介: 模板文字类型本质上是一种字符串类型。通过定义字符串必须匹配的模式,这些类型提供了一种验证和推断数据的方式。它们是大约三年前在 TypeScript 4.1 中引入的。根据最初的 GitHub PR,以下示例演示了 TypeScript 利用模板文字类型获得的多功能特性。

嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️

模板文字类型本质上是一种字符串类型。通过定义字符串必须匹配的模式,这些类型提供了一种验证和推断数据的方式。它们是大约三年前在 TypeScript 4.1 中引入的。根据最初的 GitHub PR,以下示例演示了 TypeScript 利用模板文字类型获得的多功能特性。

字符串格式验证

TypeScript 的模板文字有助于验证字符串格式。在下面的示例中,我们定义了一个 IPv4Address 类型,它使用模板文字来强制实施特定的字符串模式(IPv4 地址)。

// IPv4 地址格式,例如:192.168.0.1
type IPv4Address = `${number}.${number}.${number}.${number}`;

//> 错误:类型 '"19216801"' 不能赋值给类型 '`${number}.${number}.${number}.${number}`'
const badIpAddress: IPv4Address = '19216801';

//> 正确
const goodIpAddress: IPv4Address = '192.168.0.1';

IPv4Address 类型使用模板文字来定义 IPv4 地址的特定模式。如果字符串与该模式不匹配(例如 badIpAddress),TypeScript 将抛出错误。

从字符串中提取部分

模板文字可用于从字符串中提取组成部分,类似于在编译时解析字符串。ExtractIPv4Address 类型的目标是提取 IPv4 地址的四个段。

type ExtractIPv4Address<TIpAddress extends string> =
    TIpAddress extends `${infer A}.${infer B}.${infer C}.${infer D}` ? [A, B, C, D] : never;

//> IPv4AddressParts = ["192", "168", "0", "1"]
type IPv4AddressParts = ExtractIPv4Address<'192.168.0.1'>;

通过在模板文字中使用 TypeScript 的 infer 关键字,可以逐个提取 IP 地址的每个段。输出是与这些段对应的字符串数组。

通过分隔符分割字符串

最后,我们可以使用递归模板文字类型来模拟 JavaScript 中 split 函数的功能。Split 类型递归地将字符串 S 按分隔符 D 进行分割。

// 按分隔符分割字符串
type Split<S extends string, D extends string> =
    string extends S ? string[] :
    S extends '' ? [] :
    S extends `${infer T}${D}${
     infer U}` ? [T, ...Split<U, D>] : [S];

//> IPv4AddressParts = ["192", "168", "0", "1"]
type IPv4AddressParts = Split<'192.168.0.1', '.'>

//> IPv6AddressParts = ["2001", "0db8", "85a3", "0000", "0000", "8a2e", "0370", "7344"]
type IPv6AddressParts = Split<'2001:0db8:85a3:0000:0000:8a2e:0370:7344', ':'>;

如果字符串 S 可以按照分隔符 D 进行分割成两个段 TU,则类型返回一个数组,其中包含 T,以及 Split<U, D> 的结果。递归地继续这个过程,直到字符串 S 无法进一步分割,最后返回只包含字符串 S 作为唯一元素的数组。


🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?当你处于这个阶段时,你发现什么对你帮助最大?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨

目录
相关文章
|
数据采集 前端开发 JavaScript
服务器端渲染(SSR)与客户端渲染(CSR)的比较
服务器端渲染(SSR)与客户端渲染(CSR)的比较
1784 0
|
JavaScript 前端开发
JS实现一键复制、选中复制、选中多行复制
文章介绍了如何使用JavaScript实现一键复制文本、选中文本复制以及选中多行文本复制的功能。提供了详细的代码示例,包括创建临时textarea元素、选中文本、执行复制命令、用户提示以及清理临时元素的完整流程。同时,还考虑了用户可能选中多行文本进行复制的情况。
674 1
|
前端开发
如何定义和使用React泛型组件
通过合理地定义和使用React泛型组件,可以提高代码的复用性和可维护性,同时增强类型安全性,使React应用程序的开发更加高效和可靠。
372 65
解决Vscode使用LeetCode报错Failed to test the solution. Please open the output channel for details.
本文提供了解决在VScode中使用LeetCode插件时遇到“Failed to test the solution. Please open the output channel for details.”错误的方法,主要是通过修改setting.json文件中的输出文件夹配置来解决。
1290 1
|
11月前
|
前端开发 JavaScript 测试技术
React 时间选择器 Time Picker:常见问题与调试指南
本文介绍了在使用 React 时间选择器时常见的问题及解决方案,包括时间格式不匹配、时区问题、禁用时间范围和自定义样式等。通过代码案例详细解释了如何避免这些问题,强调了阅读文档、类型检查、单元测试和调试技巧的重要性。
269 7
|
数据挖掘 UED
CRM系统用户满意度调查:哪些品牌最受欢迎
随着国内CRM市场的快速发展,众多厂商推出了各具特色的产品。为了帮助企业选择最适合的解决方案,我们进行了用户满意度调查,涵盖系统的功能、易用性、性价比、支持服务等多个维度。调查显示,纷享销客、Zoho CRM、Salesforce、HubSpot CRM等品牌表现突出,赢得了用户的广泛认可。这些品牌凭借强大的功能、灵活的定制化选项和优秀的用户体验,满足了不同规模和行业企业的需求。
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
740 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
机器学习/深度学习 数据采集 存储
深度解析数据清理和特征工程!5本面向数据科学家的顶级书籍推荐 ⛵
本文对比筛选了『数据清理』和『特征工程』最值得推荐的5本书,帮助你有效地清理数据、获取干净核心的数据,这是后续建模分析等工作有更好结果的保证。
584 0
深度解析数据清理和特征工程!5本面向数据科学家的顶级书籍推荐 ⛵
MinHash原理与应用
MinHash首先它是一种基于 Jaccard Index 相似度的算法,也是一种LSH的降维的方法,应用于大数据集的相似度检索、推荐系统。下边按我的理解介绍下MinHash。 举例A,B 两个集合: A = {s1, s3, s6, s8, s9} B = {s3, s4, s7, s8,
4312 90