Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
Z

zod

> 编程语言
Open source

TypeScript-first schema validation with static type inference

43.4K stars0 likes1 views
WebsiteGitHub

About

TypeScript-first schema validation with static type inference

Zod

TypeScript-first schema validation with static type inference
by @colinhacks




### [Read the docs →](https://zod.dev/api)

## What is Zod? Zod is a TypeScript-first validation library. Define a schema and parse some data with it. You'll get back a strongly typed, validated result. ```ts import * as z from "zod"; const User = z.object({ name: z.string(), }); // some untrusted data... const input = { /* stuff */ }; // the parsed result is validated and type safe! const data = User.parse(input); // so you can use it with confidence :) console.log(data.name); ```
## Features - Zero external dependencies - Works in Node.js and all modern browsers - Tiny: `2kb` core bundle (gzipped) - Immutable API: methods return a new instance - Concise interface - Works with TypeScript and plain JS - Built-in JSON Schema conversion - Extensive ecosystem
## Installation ```sh npm install zod ```
## Basic usage Before you can do anything else, you need to define a schema. For the purposes of this guide, we'll use a simple object schema. ```ts import * as z from "zod"; const Player = z.object({ username: z.string(), xp: z.number(), }); ``` ### Parsing data Given any Zod schema, use `.parse` to validate an input. If it's valid, Zod returns a strongly-typed _deep clone_ of the input. ```ts Player.parse({ username: "billie", xp: 100 }); // => returns { username: "billie", xp: 100 } ``` **Note** — If your schema uses certain asynchronous APIs like `async` [refinements](https://zod.dev/api#refinements) or [transforms](https://zod.dev/api#transforms), you'll need to use the `.parseAsync()` method instead. ```ts const schema = z.string().refine(async (val) => val.length <= 8); await schema.parseAsync("hello"); // => "hello" ``` ### AOT compilation For hot validation paths, `z.compile(schema)` returns a schema clone with an ahead-of-time compiled fast path. Valid inputs take the compiled path; invalid inputs fall back to the regular parser so error reporting stays identical. Across a 55-schema benchmark the median speedup is **2.4x**, and it scales with how much work the schema does per parse: a large array of objects is ~9x, a 20-key object ~9x, a nested object ~4.5x, while a bare `z.string()` gains nothing — compilation removes per-node dispatch and allocation, and a single `typeof` has none to remove. ```ts const CompiledPlayer = z.compile(Player); CompiledPlayer.parse({ username: "billie", xp: 100 }); ``` To enable compilation globally for schemas constructed after import: ```ts import "zod/compile"; // place before modules that define schemas ``` Things to know: - Compilation uses `new Function`. Global mode is automatically disabled when `z.config({ jitless: true })` is set (e.g. CSP environments); calling `z.compile()` directly is an explicit opt-in. - Schemas with async refinements or transforms can't be compiled, and neither can a few other constructs. That is not an error: `z.compile()` hands the schema back unchanged and it keeps using the regular parser, exactly as global mode leaves it. Pass `{ strict: true }` to throw `ZodCompileAsyncError` / `ZodCompileUnsupportedError` instead. - On invalid input, refinements and transforms may run twice (fast path, then fallback). - Deriving a new schema from a compiled one (`.refine()`, `.extend()`, etc.) returns an uncompiled schema — compile the final schema. See [`compile` docs](https://zod.dev/compile) for details. ### Handling errors When validation fails, the `.parse()` method will throw a `ZodError` instance with granular information about the validation issues. ```ts try { Player.parse({ username: 42, xp: "100" }); } catch (err) { if (err instanceof z.ZodError) { err.issues; /* [ { expected: 'string', code: 'invalid_type', path: [ 'username' ], message: 'Invalid input: expected string' }, { expected: 'number', code: 'invalid_type', path: [ 'xp' ], message: 'Invalid input: expected number' } ] */ } } ``` To avoid a `try/catch` block, you can use the `.safeParse()` method to get back a plain result object containing either the successfully parsed data or a `ZodError`. The result type is a [discriminated union](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions), so you can handle both cases conveniently. ```ts const result = Player.safeParse({ username: 42, xp: "100" }); if (!result.success) { result.error; // ZodError instance } else { result.data; // { username: string; xp: number } } ``` **Note** — If your schema uses certain asynchronous APIs like `async` [refinements](https://zod.dev/api#refinements) or [transforms](https://zod.dev/api#transforms), you'll need to use the `.safeParseAsync()` method instead. ```ts const schema = z.string().refine(async (val) => val.length <= 8); await schema.safeParseAsync("hello"); // => { success: true; data: "hello" } ``` ### Inferring types Zod infers a static type from your schema definitions. You can extract this type with the `z.infer<>` utility and use it however you like. ```ts const Player = z.object({ username: z.string(), xp: z.number(), }); // extract the inferred type type Player = z.infer; // use it in your code const player: Player = { username: "billie", xp: 100 }; ``` In some cases, the input & output types of a schema can diverge. For instance, the `.transform()` API can convert the input from one type to another. In these cases, you can extract the input and output types independently: ```ts const mySchema = z.string().transform((val) => val.length); type MySchemaIn = z.input; // => string type MySchemaOut = z.output; // equivalent to z.infer // number ```

Issues· 63 open

View all issuesOpen on GitHub
  • #6615

    BIC validation

    Updated Sep 17, 2026
  • #6614

    Typo in metadata docs page

    Updated Sep 17, 2026
  • #6611

    toJSONSchema deletes an id explicitly set by override

    Updated Sep 17, 2026
  • #6613

    toJSONSchema: format/length/integer-bound constraints dropped for some schemas when converting a large multi-schema document (4.5.4 → 4.6.5)

    Updated Sep 17, 2026
  • #6612

    Async tuple rest transforms overwrite each other at the final index

    Updated Sep 16, 2026
  • #6610

    `~standard.validate()` re-parses async schemas, running every transform and refinement twice

    Updated Sep 16, 2026
  • #5686

    Zod incorrectly points to CommonJS declaration when used with ESM

    Updated Sep 16, 2026
  • #6609

    docs: three names in core.mdx don't exist in zod/v4/core

    Updated Sep 16, 2026
  • #6608

    `parseAsync()` can return the fastest successful union option instead of the first option in order

    Updated Sep 16, 2026
  • #6607

    Missing Class information on `z.instanceof().properties()`

    Updated Sep 16, 2026

> Tags

TypeScriptruntime-validationschema-validationstatic-typestype-inference

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言