本页介绍了Zod中用于操纵和组合对象模式的方法。Zod提供了丰富的工具集来转换对象模式,包括选择特定属性、组合模式、使属性可选或必需,以及控制如何处理未知属性。有关对象模式基础知识,请参阅对象模式。有关为模式添加自定义验证,请参阅Refinements。有关在验证期间转换数据,请参阅Transformations。
来源: src/__tests__/object.test.ts396-473 src/__tests__/pickomit.test.ts1-112 src/__tests__/partials.test.ts1-253
`.pick()` 和 `.omit()` 方法允许您通过从现有对象模式中选择或排除特定属性来创建新模式。
`.pick()` 创建一个只包含指定属性的新模式,类似于TypeScript的 `Pick` 实用工具类型。
来源: src/__tests__/pickomit.test.ts13-26
`.omit()` 创建一个排除指定属性的新模式,类似于TypeScript的 `Omit` 实用工具类型。
来源: src/__tests__/pickomit.test.ts48-77
生成的类型被正确推断
来源: src/__tests__/pickomit.test.ts13-17 src/__tests__/pickomit.test.ts48-52
`.extend()` 和 `.merge()` 方法允许您向现有模式添加属性或组合多个模式。
`.extend()` 向模式添加新属性或覆盖现有属性。
来源: src/__tests__/object.test.ts406-428
`.merge()` 组合两个对象模式。如果两个模式具有同名的属性,则第二个模式的属性优先。
来源: src/__tests__/object.test.ts383-404 src/__tests__/object.test.ts220-234
您可以使用 `.extend()` 来覆盖现有属性
来源: src/__tests__/object.test.ts430-443
这些方法允许您修改对象模式中属性的可选性。
`.partial()` 使对象模式中的所有属性都变为可选,类似于TypeScript的 `Partial` 实用工具类型。
来源: src/__tests__/partials.test.ts17-36 src/__tests__/object.test.ts264-270
`.deepPartial()` 递归地使所有属性都变为可选,包括嵌套对象中的属性。
来源: src/__tests__/partials.test.ts38-81 src/helpers/partialUtil.ts38-61
`.required()` 使所有可选属性变为必需。
来源: src/__tests__/partials.test.ts133-171
您也可以有选择性地使特定属性可选或必需
来源: src/__tests__/partials.test.ts203-242 src/__tests__/partials.test.ts172-201
Zod提供了几种方法来控制在验证期间如何处理未知属性(模式中未定义的属性)。
来源: src/__tests__/object.test.ts70-140
默认情况下,Zod在解析时会移除未知属性
`.passthrough()` 在解析结果中保留未知属性
`.strict()` 如果存在未知属性,解析将失败
`.catchall()` 为任何未知属性指定模式
来源: src/__tests__/object.test.ts117-147 src/__tests__/object.test.ts179-193
如果指定了多种模式,则优先级如下
来源: src/__tests__/object.test.ts129-147 src/__tests__/object.test.ts82-97
所有这些转换方法都能正确维护TypeScript的类型推断
来源: src/__tests__/pickomit.test.ts13-17 src/__tests__/object.test.ts13-24 src/__tests__/partials.test.ts17-27
| 方法 | 目的 | 示例 |
|---|---|---|
.pick() | 创建只包含指定属性的 schema | User.pick({ name: true, email: true }) |
.omit() | 创建不包含指定属性的 schema | User.omit({ id: true }) |
.extend() | 添加新属性或覆盖现有属性 | User.extend({ age: z.number() }) |
.merge() | 合并两个 schema | User.merge(Address) |
.partial() | 将所有属性设为可选 | User.partial() |
.deepPartial() | 递归地将所有属性设为可选 | User.deepPartial() |
.required() | 将可选属性设为必需 | User.required() |
.strip() | 移除未知属性(默认) | User.strip() |
.passthrough() | 保留未知属性 | User.passthrough() |
.strict() | 对未知属性抛出错误 | User.strict() |
.catchall() | 验证未知属性 | User.catchall(z.string()) |
来源: src/__tests__/object.test.ts1-473 src/__tests__/pickomit.test.ts1-112 src/__tests__/partials.test.ts1-253