编解码器
✨ 新功能 - 在 zod@4.1
中引入
¥✨ New — Introduced in zod@4.1
所有 Zod 模式都可以处理正向和反向的输入:
¥All Zod schemas can process inputs in both the forward and backward direction:
-
前进:
Input
至Output
¥Forward:
Input
toOutput
-
.parse()
-
.decode()
-
-
后退:
Output
至Input
¥Backward:
Output
toInput
.encode()
在大多数情况下,这是一个没有区别的区别。输入和输出类型相同,因此 "forward" 和 "backward" 之间没有区别。
¥In most cases, this is a distinction without a difference. The input and output types are identical, so there's no difference between "forward" and "backward".
但是,某些模式类型会导致输入和输出类型出现分歧,尤其是 z.codec()
。编解码器是一种特殊的模式,用于定义两个其他模式之间的双向转换。
¥However, some schema types cause the input and output types to diverge, notably z.codec()
. Codecs are a special type of schema that defines a bi-directional transformation between two other schemas.
在这种情况下,z.decode()
和 z.encode()
的行为截然不同。
¥In these cases, z.decode()
and z.encode()
behave quite differently.
注意 — 这里的说明或术语没有什么特别之处。与其使用 A -> B
编解码器进行编码,不如使用 B -> A
编解码器进行解码。使用 "decode" 和 "encode" 术语只是一种约定。
¥—There's nothing special about the directions or terminology here. Instead of encoding with an A -> B
codec, you could instead decode with a B -> A
codec. The use of the terms "decode" and "encode" is just a convention.
这在解析网络边界数据时尤其有用。你可以在客户端和服务器之间共享单个 Zod 模式,然后使用这个模式在网络友好格式(例如 JSON)和更丰富的 JavaScript 表示之间进行转换。
¥This is particularly useful when parsing data at a network boundary. You can share a single Zod schema between your client and server, then use this single schema to convert between a network-friendly format (say, JSON) and a richer JavaScript representation.
可组合性
¥Composability
注意 — 你可以将 z.encode()
和 z.decode()
与任何架构一起使用。它不一定是 ZodCodec。
¥— You can use z.encode()
and z.decode()
with any schema. It doesn't have to be a ZodCodec.
编解码器与其他模式一样。你可以将它们嵌套在对象、数组、管道等中。对于它们的使用位置没有任何限制!
¥Codecs are a schema like any other. You can nest them inside objects, arrays, pipes, etc. There are no rules on where you can use them!
类型安全输入
¥Type-safe inputs
虽然 .parse()
和 .decode()
在运行时的行为相同,但它们具有不同的类型签名。.parse()
方法接受 unknown
作为输入,并返回与架构推断的输出类型匹配的值。相比之下,z.decode()
和 z.encode()
函数具有强类型输入。
¥While .parse()
and .decode()
behave identically at runtime, they have different type signatures. The .parse()
method accepts unknown
as input, and returns a value that matches the schema's inferred output type. By constrast, the z.decode()
and z.encode()
functions have strongly-typed inputs.
为什么会有差异?编码和解码意味着转换。在许多情况下,这些方法的输入……这里有一张图表,展示了 parse()
、decode()
和 encode()
类型签名之间的区别。
¥Why the difference? Encoding and decoding imply transformation. In many cases, the inputs to these methods
Here's a diagram demonstrating the differences between the type signatures for parse()
, decode()
, and encode()
.


异步和安全变体
¥Async and safe variants
与 .transform()
和 .refine()
一样,编解码器支持异步转换。
¥As with .transform()
and .refine()
, codecs support async transforms.
与常规 parse()
一样,decode()
和 encode()
也存在 "safe" 和 "async" 变体。
¥As with regular parse()
, there are "safe" and "async" variants of decode()
and encode()
.
编码的工作原理
¥How encoding works
某些 Zod 模式如何 "reverse" 其解析行为存在一些微妙之处。
¥There are some subtleties to how certain Zod schemas "reverse" their parse behavior.
编解码器
¥Codecs
这个相当不言自明。编解码器封装了两种类型之间的双向转换。在 z.decode()
期间,执行 decode
转换。在 z.encode()
期间,执行 encode
转换。
¥This one is fairly self-explanatory. Codecs encapsulate a bi-directional transformation between two types. During z.decode()
, the decode
transform is executed. During z.encode()
, the encode
transform is executed.
管道
¥Pipes
有趣的是 - 编解码器实际上是在内部实现的,是管道的子类,并添加了 "interstitial" 转换逻辑。
¥Fun fact — Codecs are actually implemented internally as subclass of pipes that have been augmented with "interstitial" transform logic.
在常规解码期间,ZodPipe<A, B>
模式将首先使用 A
解析数据,然后将其传递给 B
。正如你所料,在编码过程中,数据首先使用 B
进行编码,然后传入 A
。
¥During regular decoding, a ZodPipe<A, B>
schema will first parse the data with A
, then pass it into B
. As you might expect, during encoding, the data is first encoded with B
, then passed into A
.
细化
¥Refinements
所有检查(.refine()
、.min()
、.max()
等)仍然在两个方向上执行。
¥All checks (.refine()
, .min()
, .max()
, etc.) are still executed in both directions.
为了避免自定义 .refine()
逻辑中出现意外错误,Zod 在 z.encode()
期间执行两次 "passes"。第一遍检查确保输入类型符合预期类型(无 invalid_type
错误)。如果通过了,Zod 将执行第二遍,即执行细化逻辑。
¥To avoid unexpected errors in your custom .refine()
logic, Zod performs two "passes" during z.encode()
. The first pass ensures the input type conforms to the expected type (no invalid_type
errors). If that passes, Zod performs the second pass which executes the refinement logic.
这种方法也像 z.string().trim()
或 z.string().toLowerCase()
一样支持 "修改变换":
¥This approach also supports "mutating transforms" like z.string().trim()
or z.string().toLowerCase()
:
默认值和预置错误
¥Defaults and prefaults
默认值和预置错误仅适用于 "forward" 方向。
¥Defaults and prefaults are only applied in the "forward" direction.
当你将默认值附加到模式时,输入将变为可选(| undefined
),但输出将变为可选。因此,undefined
不是 z.encode()
的有效输入,并且不会应用默认值/预置错误。
¥When you attach a default value to a schema, the input becomes optional (| undefined
) but the output does not. As such, undefined
is not a valid input to z.encode()
and defaults/prefaults will not be applied.
捕获
¥Catch
同样,.catch()
仅适用于 "forward" 方向。
¥Similarly, .catch()
is only applied in the "forward" direction.
Stringbool
注意 — Stringbool 早于 Zod 中编解码器的引入。它后来在内部被重新实现为编解码器。
¥— Stringbool pre-dates the introduction of codecs in Zod. It has since been internally re-implemented as a codec.
z.stringbool()
API 将字符串值("true"
、"false"
、"yes"
、"no"
等)转换为 boolean
。默认情况下,在 z.encode()
期间,它会将 true
转换为 "true"
,将 false
转换为 "false"
。
¥The z.stringbool()
API converts string values ("true"
, "false"
, "yes"
, "no"
, etc.) into boolean
. By default, it will convert true
to "true"
and false
to "false"
during z.encode()
..
如果你指定了一组自定义的 truthy
和 falsy
值,则将使用数组中的第一个元素。
¥If you specify a custom set of truthy
and falsy
values, the first element in the array will be used instead.
转换
¥Transforms
⚠️ — .transform()
API 实现了单向转换。如果你的架构中存在任何 .transform()
,尝试执行 z.encode()
操作将引发运行时错误(而不是 ZodError
)。
¥⚠️ — The .transform()
API implements a unidirectional transformation. If any .transform()
exists anywhere in your schema, attempting a z.encode()
operation will throw a runtime error (not a ZodError
).
有用的编解码器
¥Useful codecs
以下是一些常用编解码器的实现。为了便于定制,这些 API 并未包含在 Zod 本身中。你应该将它们复制/粘贴到你的项目中,并根据需要进行修改。
¥Below are implementations for a bunch of commonly-needed codecs. For the sake of customizability, these are not included as first-class APIs in Zod itself. Instead, you should copy/paste them into your project and modify them as needed.
注意 — 所有这些编解码器实现都已测试正确性。
¥— All of these codec implementations have been tested for correctness.
stringToNumber
使用 parseFloat()
将数字的字符串表示形式转换为 JavaScript number
类型。
¥Converts string representations of numbers to JavaScript number
type using parseFloat()
.
stringToInt
使用 parseInt()
将整数的字符串表示形式转换为 JavaScript number
类型。
¥Converts string representations of integers to JavaScript number
type using parseInt()
.
stringToBigInt
将字符串表示形式转换为 JavaScript bigint
类型。
¥Converts string representations to JavaScript bigint
type.
numberToBigInt
将 JavaScript number
转换为 bigint
类型。
¥Converts JavaScript number
to bigint
type.
isoDatetimeToDate
将 ISO 日期时间字符串转换为 JavaScript Date
对象。
¥Converts ISO datetime strings to JavaScript Date
objects.
epochSecondsToDate
将 Unix 时间戳(自纪元以来的秒数)转换为 JavaScript Date
对象。
¥Converts Unix timestamps (seconds since epoch) to JavaScript Date
objects.
epochMillisToDate
将 Unix 时间戳(自纪元以来的毫秒数)转换为 JavaScript Date
对象。
¥Converts Unix timestamps (milliseconds since epoch) to JavaScript Date
objects.
json(schema)
将 JSON 字符串解析为结构化数据,并序列化回 JSON。这个通用函数接受一个输出模式来验证解析后的 JSON 数据。
¥Parses JSON strings into structured data and serializes back to JSON. This generic function accepts an output schema to validate the parsed JSON data.
特定模式的使用示例:
¥Usage example with a specific schema:
utf8ToBytes
将 UTF-8 字符串转换为 Uint8Array
字节数组。
¥Converts UTF-8 strings to Uint8Array
byte arrays.
bytesToUtf8
将 Uint8Array
字节数组转换为 UTF-8 字符串。
¥Converts Uint8Array
byte arrays to UTF-8 strings.
base64ToBytes
将 base64 字符串转换为 Uint8Array
字节数组,反之亦然。
¥Converts base64 strings to Uint8Array
byte arrays and vice versa.
base64urlToBytes
将 base64url 字符串(URL 安全的 base64)转换为 Uint8Array
字节数组。
¥Converts base64url strings (URL-safe base64) to Uint8Array
byte arrays.
hexToBytes
将十六进制字符串转换为 Uint8Array
字节数组,反之亦然。
¥Converts hexadecimal strings to Uint8Array
byte arrays and vice versa.
stringToURL
将 URL 字符串转换为 JavaScript URL
对象。
¥Converts URL strings to JavaScript URL
objects.
stringToHttpURL
将 HTTP/HTTPS URL 字符串转换为 JavaScript URL
对象。
¥Converts HTTP/HTTPS URL strings to JavaScript URL
objects.
uriComponent
使用 encodeURIComponent()
和 decodeURIComponent()
对 URI 组件进行编码和解码。
¥Encodes and decodes URI components using encodeURIComponent()
and decodeURIComponent()
.