🎖️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 作为唯一元素的数组。


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

目录
相关文章
|
4月前
|
算法
【算法】模拟算法——替换所有的问号(easy)
【算法】模拟算法——替换所有的问号(easy)
【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等
【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等
|
7月前
|
算法 搜索推荐 程序员
第四十九练 请以递归方式实现判断一个字符串是否为回文字符串的
第四十九练 请以递归方式实现判断一个字符串是否为回文字符串的
42 0
|
JavaScript
🎖️typeScrpt中如何返回正确的类型?
条件返回类型确实是 TypeScript 中非常有用的强大功能,它允许您根据参数的类型为函数指定不同的返回类型,从而实现更强的类型安全性。
87 0
|
运维 Shell Python
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(一)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)
135 0
|
7月前
|
人工智能 自然语言处理 Java
想要搞定正则验证字串符?用这个办法最简单,质量还高!
在编程中,字符串的处理是不可避免的一部分。我们经常需要验证用户输入的数据、提取文本信息、替换特定字符等等。在这些场景中,正则验证字串符(Regex Validation)为我们提供了一种高效、灵活的处理方式。
|
存储 算法 索引
【每日挠头算法题(3)】字符串解码|数组中重复的数字
【每日挠头算法题(3)】字符串解码|数组中重复的数字
|
运维 Shell
善用chatGPT学习 | bash脚本如何判断字符串在数组中
善用chatGPT学习 | bash脚本如何判断字符串在数组中
206 0
检查两个字符串数组是否相等(简单难度)
检查两个字符串数组是否相等(简单难度)
86 0
|
缓存 算法 测试技术
经典算法面试题目-设计算法移除字符串中重复的字符(1.3)
经典算法面试题目-设计算法移除字符串中重复的字符(1.3)
177 0
经典算法面试题目-设计算法移除字符串中重复的字符(1.3)