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


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

目录
相关文章
|
6天前
|
存储 编译器 Linux
【字符串探秘:手工雕刻的String类模拟实现大揭秘】(下)
【字符串探秘:手工雕刻的String类模拟实现大揭秘】
|
6天前
|
编译器 C语言 C++
【字符串探秘:手工雕刻的String类模拟实现大揭秘】(中)
【字符串探秘:手工雕刻的String类模拟实现大揭秘】
|
6天前
|
存储 编译器
【字符串探秘:手工雕刻的String类模拟实现大揭秘】(上)
【字符串探秘:手工雕刻的String类模拟实现大揭秘】
|
9月前
|
JavaScript
🎖️typeScrpt中如何返回正确的类型?
条件返回类型确实是 TypeScript 中非常有用的强大功能,它允许您根据参数的类型为函数指定不同的返回类型,从而实现更强的类型安全性。
54 0
|
7月前
|
存储 算法 索引
【每日挠头算法题(3)】字符串解码|数组中重复的数字
【每日挠头算法题(3)】字符串解码|数组中重复的数字
|
9月前
|
运维 Shell 数据安全/隐私保护
【运维知识高级篇】超详细的Shell编程讲解4(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)(一)
【运维知识高级篇】超详细的Shell编程讲解4(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)
137 0
|
9月前
|
运维 Shell
【运维知识高级篇】超详细的Shell编程讲解4(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)(二)
【运维知识高级篇】超详细的Shell编程讲解4(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)(二)
84 0
检查两个字符串数组是否相等(简单难度)
检查两个字符串数组是否相等(简单难度)
63 0
|
前端开发 Java Spring
阿粉写了八千多字,只为讲透参数合法性验证)(一)
最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。
阿粉写了八千多字,只为讲透参数合法性验证)(一)
|
Java 数据库连接 Spring
阿粉写了八千多字,只为讲透参数合法性验证)(三)
最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。
阿粉写了八千多字,只为讲透参数合法性验证)(三)