# 基本用法

URL: https://caijiao.org/zod/basic-usage
Source: docs/zod/basic-usage.md
Description: 了解 Zod 的基础用法，包括如何创建和使用模式、验证数据以及处理验证结果

## 简单类型

创建一个简单的字符串模式：

```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 }
```
