Skip to content

object ​

包含指定字段的对象。用各自的 Schema 校验每个字段,并一次性收集所有字段的错误。

签名 ​

ts
function object<S extends Record<string, Schema>>(shape: S, options?: ObjectOptions): Schema<ObjectOut<S>>

interface ObjectOptions {
  unknown?: 'strip' | 'strict' | 'passthrough';
  message?: Message;
}

参数 ​

参数类型说明
shapeRecord<string, Schema>对象的字段及其 Schema
options.unknown'strip' | 'strict' | 'passthrough'如何处理 shape 中没有的字段。默认为 strip
options.messageMessage值为空或不是对象时的自定义信息

多余字段 ​

模式不在 shape 中的字段会怎样
strip(默认)从 data 中删除。防止批量赋值:请求中的 isAdmin: true 不会进入数据库
strict每个多余字段产生一个 unknownKey 错误
passthrough原样保留在 data 中

错误代码 ​

代码触发条件默认信息
required值为空Required
object不是对象(或是数组)Must be an object
unknownKeystrict 模式下的多余字段Unknown field

可以修改这些文本:见 错误信息与国际化。

注意事项 ​

  • 没有值的 optional 字段根本不会出现在 data 中。
  • 只读取对象自身的属性,不读取原型。输入中的 __proto__ 键是安全的。
  • 嵌套对象的错误带有路径:address.city。

示例 ​

嵌套对象 ​

ts
const Order = object({
  customer: object({
    name: string(),
    phone: string(),
  }),
  address: object({
    city: string(),
    street: string(),
  }),
});

validate(Order, { customer: { name: 'Li' }, address: {} }).errors;
// { 'customer.phone': 'Required', 'address.city': 'Required', 'address.street': 'Required' }

严格的 API ​

ts
const UpdateUser = object({ name: optional(string()) }, { unknown: 'strict' });

validate(UpdateUser, { name: 'Li', isAdmin: true }).errors; // { isAdmin: 'Unknown field' }

另请参阅 ​