# Enums

URL: https://caijiao.org/zod/enums
Source: docs/zod/enums.md
Description: 枚举类型的使用指南，包括 TypeScript 枚举和 Zod 枚举的实现方式

Zod 提供了两种方式来处理枚举：原生 TypeScript 枚举和 Zod 枚举。

## Zod 枚举

使用 `z.enum()` 创建枚举验证器：

```ts
import { z } from "zod";

const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
type FishEnum = z.infer<typeof FishEnum>; // "Salmon" | "Tuna" | "Trout"

// 验证
FishEnum.parse("Salmon"); // 通过
FishEnum.parse("Shark");  // 失败
```

## 枚举值

你可以使用 `.enum` 对象访问所有有效的枚举值：

```ts
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);

// 枚举值
console.log(FishEnum.enum.Salmon); // "Salmon"
console.log(FishEnum.enum.Tuna);   // "Tuna"

// 所有选项
console.log(FishEnum.options); // ["Salmon", "Tuna", "Trout"]
```

## 原生 TypeScript 枚举

使用 `z.nativeEnum()` 来验证原生 TypeScript 枚举：

```ts
enum NativeFish {
  Salmon = "SALMON",
  Tuna = "TUNA",
  Trout = "TROUT",
}

const NativeFishEnum = z.nativeEnum(NativeFish);
type NativeFishEnum = z.infer<typeof NativeFishEnum>; // NativeFish

// 验证
NativeFishEnum.parse(NativeFish.Salmon); // 通过
NativeFishEnum.parse("SALMON");          // 通过
NativeFishEnum.parse("Salmon");          // 失败
```

## 数字枚举

Zod 也支持数字枚举：

```ts
enum NumericFish {
  Salmon,  // 0
  Tuna,    // 1
  Trout,   // 2
}

const NumericFishEnum = z.nativeEnum(NumericFish);

// 验证
NumericFishEnum.parse(0);        // 通过
NumericFishEnum.parse(1);        // 通过
NumericFishEnum.parse("Salmon"); // 失败
```

## 常量枚举

Zod 支持 TypeScript 的 `const enum` 特性：

```ts
const enum ConstFish {
  Salmon = "SALMON",
  Tuna = "TUNA",
  Trout = "TROUT",
}

const ConstFishEnum = z.nativeEnum(ConstFish);

// 验证
ConstFishEnum.parse("SALMON"); // 通过
ConstFishEnum.parse("SHARK");  // 失败
```

## 自动补全

Zod 枚举提供了完整的类型推断和自动补全支持：

```ts
const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);

// 在编辑器中输入 FishEnum.enum. 会显示所有选项
const fish = FishEnum.enum.Salmon;

// 在编辑器中输入 fish === FishEnum.enum. 会显示所有选项
if (fish === FishEnum.enum.Tuna) {
  // ...
}
```
