菜单

组合与操作

相关源文件

本页介绍了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()` 和 `.omit()` 方法允许您通过从现有对象模式中选择或排除特定属性来创建新模式。

Pick

`.pick()` 创建一个只包含指定属性的新模式,类似于TypeScript的 `Pick` 实用工具类型。

来源: src/__tests__/pickomit.test.ts13-26

Omit

`.omit()` 创建一个排除指定属性的新模式,类似于TypeScript的 `Omit` 实用工具类型。

来源: src/__tests__/pickomit.test.ts48-77

使用示例

类型推断

生成的类型被正确推断

来源: src/__tests__/pickomit.test.ts13-17 src/__tests__/pickomit.test.ts48-52

Extend 和 Merge 方法

`.extend()` 和 `.merge()` 方法允许您向现有模式添加属性或组合多个模式。

Extend

`.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 和 Required 方法

这些方法允许您修改对象模式中属性的可选性。

部分

`.partial()` 使对象模式中的所有属性都变为可选,类似于TypeScript的 `Partial` 实用工具类型。

来源: src/__tests__/partials.test.ts17-36 src/__tests__/object.test.ts264-270

DeepPartial

`.deepPartial()` 递归地使所有属性都变为可选,包括嵌套对象中的属性。

来源: src/__tests__/partials.test.ts38-81 src/helpers/partialUtil.ts38-61

必填

`.required()` 使所有可选属性变为必需。

来源: src/__tests__/partials.test.ts133-171

选择性 Partial/Required

您也可以有选择性地使特定属性可选或必需

来源: src/__tests__/partials.test.ts203-242 src/__tests__/partials.test.ts172-201

处理未知属性

Zod提供了几种方法来控制在验证期间如何处理未知属性(模式中未定义的属性)。

来源: src/__tests__/object.test.ts70-140

Strip (默认)

默认情况下,Zod在解析时会移除未知属性

直通

`.passthrough()` 在解析结果中保留未知属性

Strict

`.strict()` 如果存在未知属性,解析将失败

Catchall

`.catchall()` 为任何未知属性指定模式

来源: src/__tests__/object.test.ts117-147 src/__tests__/object.test.ts179-193

优先级

如果指定了多种模式,则优先级如下

  • `.catchall()` 覆盖所有其他模式
  • 否则,最后指定的模式优先

来源: 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

对象 Schema 组合表

方法目的示例
.pick()创建只包含指定属性的 schemaUser.pick({ name: true, email: true })
.omit()创建不包含指定属性的 schemaUser.omit({ id: true })
.extend()添加新属性或覆盖现有属性User.extend({ age: z.number() })
.merge()合并两个 schemaUser.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