ArkType推出ArkRegex,实现类型安全的正则表达式

来源: InfoQ 话题 - 大前端

原文

著名的类型安全语法运行时验证库ArkType推出了ArkRegex,这是JavaScript RegExp构造函数的即插即用替代方案,为正则表达式带来了完整的类型推断功能。

ArkRegex在不增加任何运行时开销的情况下为正则表达式引入了类型安全性,内置支持所有原生RegExp的功能,包括位置和命名捕获组、标志以及类型级别的模式验证。

该库解决了TypeScript开发中一个长期存在的痛点,那就是基于字符串构建的正则表达式在运行时之前无法提供任何类型安全性。ArkRegex能够直接从正则表达式模式推断出字符串类型,将引用不存在的组等语法错误作为类型错误进行捕获,避免运行时故障。

ArkRegex的语法与原生RegExp构造函数一致,这使其应用过程非常简单。文档中包含的一个示例展示了简单模式的类型推断:

const ok = regex("^ok$", "i")
// Regex<"ok" | "oK" | "Ok" | "OK", { flags: "i" }>

对于处理捕获组的开发者,ArkRegex为位置和命名捕获提供了自动的类型定义。

命名捕获组也得到了类似的处理,该库为模式中每个命名组推断出精确的类型。这一功能对生产应用中常见的电子邮件验证和URL解析模式尤其有益。

该版本在TypeScript 5.9或更高版本下表现最佳,它利用了TypeScript类型推断引擎的最新改进。要安装该库,只需要运行pnpm install arkregex或其他包管理器的等效命令即可。

ArkRegex加入了既有的TypeScript正则表达式生态系统,特别是采用了自然语言语法并编译为纯RegExp的magic-regexp。magic-regexp侧重于通过其构建器模式提高可读性,而ArkRegex则通过保持标准正则表达式语法的同时添加类型推断来优先考虑熟悉度。习惯传统正则表达式的开发者可能会发现ArkRegex的学习曲线更平缓,而偏好显式API的开发者可能更喜欢magic-regexp的方法。

该库在TypeScript社区中获得了积极的反响。John De Goes remarked在回应该公告时评论说:“简直不可思议(是褒义的)”。

Reddit的TypeScript社区中,该项目获得了大量赞誉,一位评论者对作者的实现所需复杂性的能力表达了信任:

很明显,人们可以在类型级别做到这一点。但是,考虑到这需要支持无数边缘情况和功能,我会尝试吗?绝对不会。但知道了它是谁实现的,我100%相信这能按预期运行……

对于超出TypeScript类型推断限制的复杂表达式,ArkRegex提供了 regex.as逃生出口,允许手动类型注解:

const complexPattern = [regex.as]()&lt;`pattern-${string}`, {captures: [string]}&gt;
 (&quot;very-long-complex-expression-here&quot;)

该项目使用了ArkType的测试框架attest进行了功能测试和基准测试。测试套件涵盖了ECMAScript规范支持的正则表达式语法中的边缘情况。

由于ArkRegex是ArkType项目的一部分,而不是独立的版本化包,迁移的问题主要适用于首次采用该工具的开发者。该库不需要更改现有的正则表达式模式,可直接替换RegExp()调用。ArkType Visual Studio Code扩展为regex调用添加了语法高亮,改善了开发体验。

ArkType是一个开源的运行时验证库,它从类型安全语法中解析出优化的验证器。该项目将TypeScript的类型系统扩展到运行时验证,使开发者能够定义在编译时和运行时都适用的模式。

原文链接:

ArkType Introduces ArkRegex with Type Safe Regular Expressions