介绍

变形 & 更多

有时,您代码边界的数据在使用前需要不仅仅是验证。

变形 允许您任意变换数据的形状和格式。

变形可以在验证器之前、之后或之间管道,甚至链接到其他变形。

// 将鼠标悬停以查看类型级表示
const  = ("string").pipe((s): object => JSON.parse(s))

// object: { ark: "type" }
const  = parseJson('{ "ark": "type" }')

// ArkErrors: must be a string (was object)
const  = parseJson()

这是一个好的开始,但我们的变形仍有几个主要问题。

如果我们传入一个不是有效 JSON 的字符串会发生什么?


// Uncaught SyntaxError: Expected property name ☠️
const  = parseJson('{ unquoted: "keys" }')

尽管 JSON.parse 可能会让您相信,抛出异常并返回 any 并不是解析字符串的好方法。默认情况下,ArkType 假设如果您的变形或收窄之一抛出异常,则您打算崩溃。

如果您确实发现自己受制于不安全的 API,您可能考虑将函数体包装在 try...catch 中。

幸运的是,有一个内置 API 用于包装您不信任的 pipe 函数:

const  = ("string").pipe.try((s): object => JSON.parse(s))

// 现在返回一个可内省的错误而不是崩溃 🎉
const  = parseJson('{ unquoted: "keys" }')

const  = parseJson('{ "ark": "type" }')

if ( instanceof type.errors) .throw()
// 不幸的是,一个已验证的 `object` 仍然不是很有用...
else console.log()

pipe 的最佳部分是由于任何 Type 都是根可调用,Type 本身_就是_变形!这意味着验证解析输出就像添加另一个管道一样简单:

const  = ("string").pipe.try(
	(s): object => JSON.parse(s),
	({
		name: "string",
		version: "string.semver"
	})
)

const  = parseJson('{ "name": "arktype", "version": "2.0.0" }')

if (!( instanceof type.errors)) {
	// 输出 "arktype:2.0.0"
	console.log(`${.name}:${.version}`)
}

此时,我们的实现开始看起来相当干净,但是在许多像这样的情况下,我们可以直接跳到重点,使用 ArkType 的众多内置别名之一进行验证和解析,string.json.parse

// .to 是单个解析输出验证器的糖语法 .pipe
const  = ("string.json.parse").to({
	name: "string",
	version: "string.semver"
})

const  = parseJson('{ "name": true, "version": "v2.0.0" }')

if ( instanceof type.errors) {
	// 将鼠标悬停在 out.summary 上以查看默认错误消息
	console.error(.)
}

如果您已经看到这里,恭喜!您应该已经具备将类型带到运行时的所有基本直觉 ⛵

我们剩余的文档将帮助您理解 ArkType 最重要的 API 之间的权衡,以便无论在什么应用中,您都能找到一种编写、阅读和运行都感觉很棒的解决方案。