前端TypeScript数据校验库Zod的快速上手指南

 更新时间:2026年06月05日 10:14:27   作者:伊可历普斯  
Zod是一个TypeScript优先的模式验证库,核心优势是类型安全和运行时校验的结合,既能在编译期提供类型提示,也能在运行期校验数据,这篇文章主要介绍了前端TypeScript数据校验库Zod的快速上手指南,需要的朋友可以参考下

一、Zod 是什么?

Zod 是一个TypeScript 优先的类型校验库,核心作用是:

  1. 用简洁的语法定义「数据校验规则 + TypeScript 类型」(一份代码,双重收益);
  2. 校验前端表单、API 响应、环境变量等任意数据,返回清晰的错误信息;
  3. 零依赖、体积小,适配前端 / Node.js 项目,是替代 Joi、Yup 的主流选择。

二、5 分钟快速上手(Vue3/Vite 项目为例)

步骤 1:安装

npm install zod
# 或 yarn/pnpm
pnpm add zod

步骤 2:核心用法(定义 → 校验 → 提取类型)

Zod 的核心逻辑是:先定义 Schema 校验规则 → 用 Schema 校验数据 → 自动推导 TS 类型。

// src/utils/validate.ts
import { z } from 'zod';

// 1. 定义校验规则(Schema)
const UserSchema = z.object({
  // 必选字符串,非空
  username: z.string().min(2, '用户名至少2个字符').max(20),
  // 可选数字,大于0
  age: z.number().optional().positive('年龄必须为正数'),
  // 邮箱格式校验
  email: z.string().email('请输入正确的邮箱格式'),
  // 枚举值限制
  role: z.enum(['admin', 'user', 'guest'], '角色只能是admin/user/guest'),
  // 嵌套对象
  address: z.object({
    city: z.string(),
    street: z.string().optional()
  })
});

// 2. 提取 TS 类型(无需手动写 interface)
type User = z.infer<typeof UserSchema>;

// 3. 校验数据
function validateUser(data: unknown) {
  try {
    // 严格校验:不符合规则会抛错
    const validData = UserSchema.parse(data);
    console.log('校验通过', validData);
    return { success: true, data: validData };
  } catch (error) {
    // 捕获错误并格式化
    if (error instanceof z.ZodError) {
      const errMsg = error.errors.map(item => ({
        field: item.path.join('.'), // 错误字段(如 address.city)
        message: item.message       // 错误提示
      }));
      return { success: false, errors: errMsg };
    }
    return { success: false, errors: [{ field: 'unknown', message: '未知错误' }] };
  }
}

// 测试:校验合法数据
const validUser = {
  username: '张三',
  email: 'zhangsan@test.com',
  role: 'user',
  address: { city: '北京' }
};
console.log(validateUser(validUser)); // success: true

// 测试:校验非法数据
const invalidUser = {
  username: '张', // 长度不足
  email: '123',   // 邮箱格式错误
  role: 'super',  // 枚举值错误
  address: { city: 123 } // 类型错误
};
console.log(validateUser(invalidUser)); 
// success: false,errors 包含所有错误字段和提示

步骤 3:项目实战场景

场景 1:校验前端表单(Vue3 示例)

<!-- src/components/LoginForm.vue -->
<template>
  <form @submit.prevent="submitForm">
    <input v-model="form.email" placeholder="邮箱" />
    <div v-if="errors.email">{{ errors.email }}</div>
    
    <input v-model="form.password" placeholder="密码" />
    <div v-if="errors.password">{{ errors.password }}</div>
    
    <button type="submit">提交</button>
  </form>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { z } from 'zod';

// 定义表单校验规则
const LoginSchema = z.object({
  email: z.string().email('请输入正确的邮箱'),
  password: z.string().min(6, '密码至少6位')
});
type LoginForm = z.infer<typeof LoginSchema>;

// 表单数据
const form = ref<LoginForm>({ email: '', password: '' });
const errors = ref<Record<string, string>>({});

// 提交表单
const submitForm = () => {
  // 清空之前的错误
  errors.value = {};
  
  // 校验数据(safeParse 不抛错,返回结果)
  const result = LoginSchema.safeParse(form.value);
  if (!result.success) {
    // 格式化错误信息
    result.error.errors.forEach(item => {
      errors.value[item.path[0]] = item.message;
    });
    return;
  }
  
  // 校验通过,调用接口
  console.log('表单数据合法', result.data);
};
</script>

场景 2:校验 API 响应

// src/api/user.ts
import { z } from 'zod';
import axios from 'axios';
// 定义 API 响应规则
const UserListSchema = z.array(
  z.object({
    id: z.number(),
    name: z.string(),
    avatar: z.string().url().optional() // 可选URL
  })
);
// 请求接口并校验响应
async function getUserList() {
  const res = await axios.get('/api/users');
  // 校验响应数据,确保符合预期
  const validData = UserListSchema.parse(res.data);
  return validData;
}

场景 3:校验环境变量(Vite 项目)

// src/utils/env.ts
import { z } from 'zod';

// 定义环境变量规则
const EnvSchema = z.object({
  VITE_API_BASE: z.string().url('API地址必须是合法URL'),
  VITE_GA_ID: z.string().optional()
});

// 校验 Vite 环境变量
const env = EnvSchema.parse(import.meta.env);
// 导出类型安全的环境变量
export default env;

三、高频实用 API 速查

表格

API 示例作用
z.string().min(2)字符串,最小长度 2
z.number().int()整数
z.boolean()布尔值
z.array(z.string())字符串数组
z.object({ a: z.string() })对象校验
z.enum(['a', 'b'])枚举值限制
z.date()日期类型
z.any()任意类型
z.optional(z.string())可选字符串
z.nullable(z.string())可空字符串
schema.parse(data)严格校验,失败抛错
schema.safeParse(data)安全校验,返回结果(不抛错)
z.infer<typeof schema>从 Schema 提取 TS 类型

总结

  1. Zod 核心是「Schema 定义 → 数据校验 → 自动推导 TS 类型」,一份代码兼顾校验和类型;
  2. 常用场景:表单校验、API 响应校验、环境变量校验,适配前端 / Node.js;
  3. 核心 API:z.object/z.string/z.number 定义规则,parse/safeParse 校验数据,z.infer 提取类型。

上手关键:先定义 Schema,再用 safeParse 校验数据(避免抛错),最后格式化错误信息返回给用户。

到此这篇关于前端TypeScript数据校验库Zod快速上手指南的文章就介绍到这了,更多相关TS数据校验库Zod内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • JavaScript中filter的用法实例分析

    JavaScript中filter的用法实例分析

    这篇文章主要介绍了JavaScript中filter的用法,结合实例形式分析了filter的功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • 一文详解为什么JavaScript中的JSON.parse()报错

    一文详解为什么JavaScript中的JSON.parse()报错

    这篇文章主要介绍了JavaScript中JSON.parse()方法的使用和常见错误,包括非法JSON格式、包含不可解析的字符、使用单引号等,并提供了相应的解决方案和实际项目中的代码示例,需要的朋友可以参考下
    2025-03-03
  • Javascript将JSON日期格式化

    Javascript将JSON日期格式化

    在做项目中,将实体转化为JSON后,结果后台返回json时间格式为/Date(1306418993027)/,在前台JS里显示的并不是真正的日期,而且我们不能把所有日期字段都变成string吧,因此写了Javascript的扩展方法,来实现这个功能,代码如下
    2016-08-08
  • js用于树型结构级联选择

    js用于树型结构级联选择

    js用于树型结构级联选择...
    2007-01-01
  • 常用的js验证和数据处理总结

    常用的js验证和数据处理总结

    遇到需要对数据及表单验证的,我相信大家都像我一样,喜欢在网上找相关的方法,因为自己写的话,是比较耗时的。今天就给大家分享一下,自己在工作中总结的一些常用的js。
    2016-08-08
  • 使用JavaScript实现检测网页是否为空闲状态

    使用JavaScript实现检测网页是否为空闲状态

    最近开发项目时,常碰到“用户在一定时间内无任何操作时,跳转到某个页面”的需求,所以本文就来使用JavaScript实现这一要求,需要的可以参考下
    2024-03-03
  • xmlplus组件设计系列之按钮(2)

    xmlplus组件设计系列之按钮(2)

    xmlplus 是一个JavaScript框架,用于快速开发前后端项目。这篇文章主要介绍了xmlplus组件设计系列之按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 纯css+js写的一个简单的tab标签页带样式

    纯css+js写的一个简单的tab标签页带样式

    最近经常要用tab标签页,于是就写了一个简单的tab标签页,纯css+js写的,带样式。大家可以参考下
    2014-01-01
  • 利用Axios实现无感知双Token刷新的详细教程

    利用Axios实现无感知双Token刷新的详细教程

    在现代系统中,Token认证已成为保障用户安全的标准做法,然而,尽管许多系统采用了这种认证方式,却在处理Token刷新方面存在不足,导致用户体验不佳,许多系统未能提供一种无缝的、用户无感知的Token刷新机制,所以本文介绍了教你用Axios实现无感知双Token刷新
    2024-08-08
  • JS判断日期格式是否合法的简单实例

    JS判断日期格式是否合法的简单实例

    下面小编就为大家带来一篇JS判断日期格式是否合法的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07

最新评论