介绍

添加约束

TypeScript 在表示像 stringnumber 这样的类型时极其灵活,但 email小于 100 的整数 呢?

在 ArkType 中,将类型缩小超出其 basis 的条件称为 约束

约束是 ArkType 的第一类公民。它们与 TypeScript 的内置运算符完全可组合,并受相同的基本集合论原则支配。

定义

让我们创建一个新的 contact 类型,它强制执行我们的示例约束。

const  = ({
	// 许多常见的约束作为内置关键字可用
	email: "string.email",
	// 其他可以编写为类型安全的表达式
	score: "number.integer < 100"
})

// 如果你需要 TS 类型,只需像平常一样推断它
type  = typeof .infer

组合

想象一下,我们想要定义一个表示非空 Contact 列表的新类型。

虽然我们一直在使用的表达式语法非常适合创建新类型,但链式调用是精炼或转换现有类型的好方法。

const  = ({
	email: "string.email",
	score: "number.integer < 100"
})

type  = typeof .t

interface Contact extends  {}

export const : <Contact> = 
const  = .array().atLeastLength(1)

缩小

像除数和范围这样的结构化约束只能带我们走这么远。幸运的是,它们与您所需的任何自定义验证逻辑无缝集成。


// 没有“不可被整除”的表达式 - 需要缩小
const  = ("number").narrow((n, ctx) =>
	// 如果是偶数,添加一个可自定义的错误并返回 false
	n % 2 === 0 ? ctx.mustBe("odd") : true
)

const  = ({
	even: "number % 2",
	odd: 
})

const  = FavoriteNumbers({
	even: 7,
	odd: 8
})

if ( instanceof type.errors) {
	// 将鼠标悬停在 summary 上查看验证错误
	console.error(.)
} else {
	console.log(.odd)
}

您现在知道如何精炼您的类型,以在运行时强制执行额外的约束。

但如果一旦您的输入完全验证后,您仍然需要在它准备好使用之前进行一些调整呢?

介绍的最后一部分将涵盖 morphs,这是一个极其强大的工具,用于组合和转换类型。

On this page