validate
按 Schema 校验数据并返回结果:是否有效、清洗后的数据和错误。不会因为数据无效而抛出异常。
签名
ts
function validate<S extends Schema>(schema: S, value: unknown, options?: Options): Result<Infer<S>>参数
| 参数 | 类型 | 说明 |
|---|---|---|
schema | Schema | 用于校验数据的 Schema |
value | unknown | 任意数据:表单对象、req.body、字符串… |
options | Options | 可选设置,见下文 |
选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
all | boolean | false | 在 issues 中收集字段的全部错误,而不是在第一个错误处停止。errors 中仍为第一个错误 |
messages | Record<string, Message> | — | 仅用于本次调用的信息 —— 例如当前请求的语言。缺少的信息取自 setMessages |
labels | Record<string, string> | — | 按路径指定 {label} 的字段名称:{ email: '邮箱', 'address.city': '城市' }。见 label |
maxDepth | number | 256 | 递归 Schema lazy 的最大嵌套层级 |
abortEarly | boolean | false | 遇到第一个错误即停止校验。结果中只有一个错误 —— 在不需要详细信息的服务端更快。不适用于表单 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
valid | boolean | 没有错误时为 true |
data | T | undefined | 清洗后的数据:已应用 trim、coerce 和默认值,多余字段已删除。出错时为 undefined |
errors | Record<string, string> | 每个字段的第一个错误。键为点分隔路径:name、address.city、items.0.title。值本身的错误在键 '' 下 |
issues | Issue[] | 按顺序排列的全部错误:{ code, message, path, params },其中 path 为数组(['items', 0, 'title']),params 为规则参数({ min: 8 }) |
如果 Schema 中包含 checkAsync,validate 会抛出错误 —— 请使用 validateAsync。
示例
浏览器表单
ts
const Login = object({
email: pipe(string(), trim(), email()),
password: pipe(string(), minLength(8)),
});
const result = validate(Login, { email: 'bad', password: '123' });
result.valid; // false
result.errors; // { email: 'Invalid email', password: 'Must be at least 8 characters long' }校验成功
ts
const result = validate(Login, { email: ' Li@Mail.cn ', password: '12345678', remember: 'on' });
result.valid; // true
result.data; // { email: 'Li@Mail.cn', password: '12345678' } —— 已去除空格,多余字段已删除字段的全部错误
ts
const Code = pipe(string(), length(6), pattern(/^\d+$/));
validate(Code, 'abc').issues.length; // 1
validate(Code, 'abc', { all: true }).issues.length; // 2另请参阅
- validateAsync:用于异步检查
- parse:返回数据或抛出异常
- TypeScript:收窄结果类型