教程 zod tutorial

基本用法

简单类型

创建一个简单的字符串模式:

ts
import { z } from "zod";

// 创建一个字符串的模式
const mySchema = z.string();

// 解析
mySchema.parse("tuna"); // => "tuna"
mySchema.parse(12); // => throws ZodError

// "安全"解析(如果验证失败不抛出错误)
mySchema.safeParse("tuna"); // => { success: true; data: "tuna" }
mySchema.safeParse(12); // => { success: false; error: ZodError }

对象模式

创建一个对象模式:

ts
import { z } from "zod";

const User = z.object({
  username: z.string(),
  age: z.number(),
});

User.parse({ username: "Ludwig", age: 25 });

// 提取出推断的类型
type User = z.infer<typeof User>;
// { username: string; age: number }

错误处理

使用 safeParse 来安全地处理验证错误:

ts
const result = User.safeParse({ username: 123, age: "25" });

if (!result.success) {
  console.log(result.error.issues);
  // [
  //   {
  //     "code": "invalid_type",
  //     "expected": "string",
  //     "received": "number",
  //     "path": ["username"],
  //     "message": "Expected string, received number"
  //   },
  //   {
  //     "code": "invalid_type",
  //     "expected": "number",
  //     "received": "string",
  //     "path": ["age"],
  //     "message": "Expected number, received string"
  //   }
  // ]
}

类型推断

使用 z.infer 来提取模式的 TypeScript 类型:

ts
const NumberSchema = z.number();
type NumberType = z.infer<typeof NumberSchema>; // number

const StringSchema = z.string();
type StringType = z.infer<typeof StringSchema>; // string

const ObjectSchema = z.object({
  name: z.string(),
  age: z.number().optional(),
});
type ObjectType = z.infer<typeof ObjectSchema>;
// { name: string; age?: number | undefined }