Skip to content

validate ​

按 Schema 校验数据并返回结果:是否有效、清洗后的数据和错误。不会因为数据无效而抛出异常。

签名 ​

ts
function validate<S extends Schema>(schema: S, value: unknown, options?: Options): Result<Infer<S>>

参数 ​

参数类型说明
schemaSchema用于校验数据的 Schema
valueunknown任意数据:表单对象、req.body、字符串…
optionsOptions可选设置,见下文

选项 ​

选项类型默认值说明
allbooleanfalse在 issues 中收集字段的全部错误,而不是在第一个错误处停止。errors 中仍为第一个错误
messagesRecord<string, Message>—仅用于本次调用的信息 —— 例如当前请求的语言。缺少的信息取自 setMessages
labelsRecord<string, string>—按路径指定 {label} 的字段名称:{ email: '邮箱', 'address.city': '城市' }。见 label
maxDepthnumber256递归 Schema lazy 的最大嵌套层级
abortEarlybooleanfalse遇到第一个错误即停止校验。结果中只有一个错误 —— 在不需要详细信息的服务端更快。不适用于表单

返回值 ​

字段类型说明
validboolean没有错误时为 true
dataT | undefined清洗后的数据:已应用 trim、coerce 和默认值,多余字段已删除。出错时为 undefined
errorsRecord<string, string>每个字段的第一个错误。键为点分隔路径:name、address.city、items.0.title。值本身的错误在键 '' 下
issuesIssue[]按顺序排列的全部错误:{ 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

另请参阅 ​