嗨,大家好!这里是道长王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
进行分割成两个段 T
和 U
,则类型返回一个数组,其中包含 T
,以及 Split<U, D>
的结果。递归地继续这个过程,直到字符串 S
无法进一步分割,最后返回只包含字符串 S
作为唯一元素的数组。
🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?当你处于这个阶段时,你发现什么对你帮助最大?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨