最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端TypeScript數(shù)據(jù)校驗(yàn)庫(kù)Zod的快速上手指南

 更新時(shí)間:2026年06月05日 10:14:27   作者:伊可歷普斯  
Zod是一個(gè)TypeScript優(yōu)先的模式驗(yàn)證庫(kù),核心優(yōu)勢(shì)是類型安全和運(yùn)行時(shí)校驗(yàn)的結(jié)合,既能在編譯期提供類型提示,也能在運(yùn)行期校驗(yàn)數(shù)據(jù),這篇文章主要介紹了前端TypeScript數(shù)據(jù)校驗(yàn)庫(kù)Zod的快速上手指南,需要的朋友可以參考下

一、Zod 是什么?

Zod 是一個(gè)TypeScript 優(yōu)先的類型校驗(yàn)庫(kù),核心作用是:

  1. 用簡(jiǎn)潔的語法定義「數(shù)據(jù)校驗(yàn)規(guī)則 + TypeScript 類型」(一份代碼,雙重收益);
  2. 校驗(yàn)前端表單、API 響應(yīng)、環(huán)境變量等任意數(shù)據(jù),返回清晰的錯(cuò)誤信息;
  3. 零依賴、體積小,適配前端 / Node.js 項(xiàng)目,是替代 Joi、Yup 的主流選擇。

二、5 分鐘快速上手(Vue3/Vite 項(xiàng)目為例)

步驟 1:安裝

npm install zod
# 或 yarn/pnpm
pnpm add zod

步驟 2:核心用法(定義 → 校驗(yàn) → 提取類型)

Zod 的核心邏輯是:先定義 Schema 校驗(yàn)規(guī)則 → 用 Schema 校驗(yàn)數(shù)據(jù) → 自動(dòng)推導(dǎo) TS 類型。

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

// 1. 定義校驗(yàn)規(guī)則(Schema)
const UserSchema = z.object({
  // 必選字符串,非空
  username: z.string().min(2, '用戶名至少2個(gè)字符').max(20),
  // 可選數(shù)字,大于0
  age: z.number().optional().positive('年齡必須為正數(shù)'),
  // 郵箱格式校驗(yàn)
  email: z.string().email('請(qǐng)輸入正確的郵箱格式'),
  // 枚舉值限制
  role: z.enum(['admin', 'user', 'guest'], '角色只能是admin/user/guest'),
  // 嵌套對(duì)象
  address: z.object({
    city: z.string(),
    street: z.string().optional()
  })
});

// 2. 提取 TS 類型(無需手動(dòng)寫 interface)
type User = z.infer<typeof UserSchema>;

// 3. 校驗(yàn)數(shù)據(jù)
function validateUser(data: unknown) {
  try {
    // 嚴(yán)格校驗(yàn):不符合規(guī)則會(huì)拋錯(cuò)
    const validData = UserSchema.parse(data);
    console.log('校驗(yàn)通過', validData);
    return { success: true, data: validData };
  } catch (error) {
    // 捕獲錯(cuò)誤并格式化
    if (error instanceof z.ZodError) {
      const errMsg = error.errors.map(item => ({
        field: item.path.join('.'), // 錯(cuò)誤字段(如 address.city)
        message: item.message       // 錯(cuò)誤提示
      }));
      return { success: false, errors: errMsg };
    }
    return { success: false, errors: [{ field: 'unknown', message: '未知錯(cuò)誤' }] };
  }
}

// 測(cè)試:校驗(yàn)合法數(shù)據(jù)
const validUser = {
  username: '張三',
  email: 'zhangsan@test.com',
  role: 'user',
  address: { city: '北京' }
};
console.log(validateUser(validUser)); // success: true

// 測(cè)試:校驗(yàn)非法數(shù)據(jù)
const invalidUser = {
  username: '張', // 長(zhǎng)度不足
  email: '123',   // 郵箱格式錯(cuò)誤
  role: 'super',  // 枚舉值錯(cuò)誤
  address: { city: 123 } // 類型錯(cuò)誤
};
console.log(validateUser(invalidUser)); 
// success: false,errors 包含所有錯(cuò)誤字段和提示

步驟 3:項(xiàng)目實(shí)戰(zhàn)場(chǎng)景

場(chǎng)景 1:校驗(yàn)前端表單(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';

// 定義表單校驗(yàn)規(guī)則
const LoginSchema = z.object({
  email: z.string().email('請(qǐng)輸入正確的郵箱'),
  password: z.string().min(6, '密碼至少6位')
});
type LoginForm = z.infer<typeof LoginSchema>;

// 表單數(shù)據(jù)
const form = ref<LoginForm>({ email: '', password: '' });
const errors = ref<Record<string, string>>({});

// 提交表單
const submitForm = () => {
  // 清空之前的錯(cuò)誤
  errors.value = {};
  
  // 校驗(yàn)數(shù)據(jù)(safeParse 不拋錯(cuò),返回結(jié)果)
  const result = LoginSchema.safeParse(form.value);
  if (!result.success) {
    // 格式化錯(cuò)誤信息
    result.error.errors.forEach(item => {
      errors.value[item.path[0]] = item.message;
    });
    return;
  }
  
  // 校驗(yàn)通過,調(diào)用接口
  console.log('表單數(shù)據(jù)合法', result.data);
};
</script>

場(chǎng)景 2:校驗(yàn) API 響應(yīng)

// src/api/user.ts
import { z } from 'zod';
import axios from 'axios';
// 定義 API 響應(yīng)規(guī)則
const UserListSchema = z.array(
  z.object({
    id: z.number(),
    name: z.string(),
    avatar: z.string().url().optional() // 可選URL
  })
);
// 請(qǐng)求接口并校驗(yàn)響應(yīng)
async function getUserList() {
  const res = await axios.get('/api/users');
  // 校驗(yàn)響應(yīng)數(shù)據(jù),確保符合預(yù)期
  const validData = UserListSchema.parse(res.data);
  return validData;
}

場(chǎng)景 3:校驗(yàn)環(huán)境變量(Vite 項(xiàng)目)

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

// 定義環(huán)境變量規(guī)則
const EnvSchema = z.object({
  VITE_API_BASE: z.string().url('API地址必須是合法URL'),
  VITE_GA_ID: z.string().optional()
});

// 校驗(yàn) Vite 環(huán)境變量
const env = EnvSchema.parse(import.meta.env);
// 導(dǎo)出類型安全的環(huán)境變量
export default env;

三、高頻實(shí)用 API 速查

表格

API 示例作用
z.string().min(2)字符串,最小長(zhǎng)度 2
z.number().int()整數(shù)
z.boolean()布爾值
z.array(z.string())字符串?dāng)?shù)組
z.object({ a: z.string() })對(duì)象校驗(yàn)
z.enum(['a', 'b'])枚舉值限制
z.date()日期類型
z.any()任意類型
z.optional(z.string())可選字符串
z.nullable(z.string())可空字符串
schema.parse(data)嚴(yán)格校驗(yàn),失敗拋錯(cuò)
schema.safeParse(data)安全校驗(yàn),返回結(jié)果(不拋錯(cuò))
z.infer<typeof schema>從 Schema 提取 TS 類型

總結(jié)

  1. Zod 核心是「Schema 定義 → 數(shù)據(jù)校驗(yàn) → 自動(dòng)推導(dǎo) TS 類型」,一份代碼兼顧校驗(yàn)和類型;
  2. 常用場(chǎng)景:表單校驗(yàn)、API 響應(yīng)校驗(yàn)、環(huán)境變量校驗(yàn),適配前端 / Node.js;
  3. 核心 API:z.object/z.string/z.number 定義規(guī)則,parse/safeParse 校驗(yàn)數(shù)據(jù),z.infer 提取類型。

上手關(guān)鍵:先定義 Schema,再用 safeParse 校驗(yàn)數(shù)據(jù)(避免拋錯(cuò)),最后格式化錯(cuò)誤信息返回給用戶。

到此這篇關(guān)于前端TypeScript數(shù)據(jù)校驗(yàn)庫(kù)Zod快速上手指南的文章就介紹到這了,更多相關(guān)TS數(shù)據(jù)校驗(yàn)庫(kù)Zod內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中filter的用法實(shí)例分析

    JavaScript中filter的用法實(shí)例分析

    這篇文章主要介紹了JavaScript中filter的用法,結(jié)合實(shí)例形式分析了filter的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • 一文詳解為什么JavaScript中的JSON.parse()報(bào)錯(cuò)

    一文詳解為什么JavaScript中的JSON.parse()報(bào)錯(cuò)

    這篇文章主要介紹了JavaScript中JSON.parse()方法的使用和常見錯(cuò)誤,包括非法JSON格式、包含不可解析的字符、使用單引號(hào)等,并提供了相應(yīng)的解決方案和實(shí)際項(xiàng)目中的代碼示例,需要的朋友可以參考下
    2025-03-03
  • Javascript將JSON日期格式化

    Javascript將JSON日期格式化

    在做項(xiàng)目中,將實(shí)體轉(zhuǎn)化為JSON后,結(jié)果后臺(tái)返回json時(shí)間格式為/Date(1306418993027)/,在前臺(tái)JS里顯示的并不是真正的日期,而且我們不能把所有日期字段都變成string吧,因此寫了Javascript的擴(kuò)展方法,來實(shí)現(xiàn)這個(gè)功能,代碼如下
    2016-08-08
  • js用于樹型結(jié)構(gòu)級(jí)聯(lián)選擇

    js用于樹型結(jié)構(gòu)級(jí)聯(lián)選擇

    js用于樹型結(jié)構(gòu)級(jí)聯(lián)選擇...
    2007-01-01
  • 常用的js驗(yàn)證和數(shù)據(jù)處理總結(jié)

    常用的js驗(yàn)證和數(shù)據(jù)處理總結(jié)

    遇到需要對(duì)數(shù)據(jù)及表單驗(yàn)證的,我相信大家都像我一樣,喜歡在網(wǎng)上找相關(guān)的方法,因?yàn)樽约簩懙脑?,是比較耗時(shí)的。今天就給大家分享一下,自己在工作中總結(jié)的一些常用的js。
    2016-08-08
  • 使用JavaScript實(shí)現(xiàn)檢測(cè)網(wǎng)頁(yè)是否為空閑狀態(tài)

    使用JavaScript實(shí)現(xiàn)檢測(cè)網(wǎng)頁(yè)是否為空閑狀態(tài)

    最近開發(fā)項(xiàng)目時(shí),常碰到“用戶在一定時(shí)間內(nèi)無任何操作時(shí),跳轉(zhuǎn)到某個(gè)頁(yè)面”的需求,所以本文就來使用JavaScript實(shí)現(xiàn)這一要求,需要的可以參考下
    2024-03-03
  • xmlplus組件設(shè)計(jì)系列之按鈕(2)

    xmlplus組件設(shè)計(jì)系列之按鈕(2)

    xmlplus 是一個(gè)JavaScript框架,用于快速開發(fā)前后端項(xiàng)目。這篇文章主要介紹了xmlplus組件設(shè)計(jì)系列之按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 純css+js寫的一個(gè)簡(jiǎn)單的tab標(biāo)簽頁(yè)帶樣式

    純css+js寫的一個(gè)簡(jiǎn)單的tab標(biāo)簽頁(yè)帶樣式

    最近經(jīng)常要用tab標(biāo)簽頁(yè),于是就寫了一個(gè)簡(jiǎn)單的tab標(biāo)簽頁(yè),純css+js寫的,帶樣式。大家可以參考下
    2014-01-01
  • 利用Axios實(shí)現(xiàn)無感知雙Token刷新的詳細(xì)教程

    利用Axios實(shí)現(xiàn)無感知雙Token刷新的詳細(xì)教程

    在現(xiàn)代系統(tǒng)中,Token認(rèn)證已成為保障用戶安全的標(biāo)準(zhǔn)做法,然而,盡管許多系統(tǒng)采用了這種認(rèn)證方式,卻在處理Token刷新方面存在不足,導(dǎo)致用戶體驗(yàn)不佳,許多系統(tǒng)未能提供一種無縫的、用戶無感知的Token刷新機(jī)制,所以本文介紹了教你用Axios實(shí)現(xiàn)無感知雙Token刷新
    2024-08-08
  • JS判斷日期格式是否合法的簡(jiǎn)單實(shí)例

    JS判斷日期格式是否合法的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄狫S判斷日期格式是否合法的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07

最新評(píng)論

利川市| 奉化市| 永修县| 米易县| 鄄城县| 谢通门县| 黄石市| 阿克| 霞浦县| 长乐市| 湖南省| 凌云县| 清远市| 伊通| 武穴市| 青冈县| 温州市| 河北区| 佛教| 绥德县| 新泰市| 万宁市| 呼和浩特市| 报价| 安泽县| 马公市| 遂平县| 牡丹江市| 普兰县| 永康市| 庄浪县| 康定县| 密云县| 伊春市| 尖扎县| 光山县| 香河县| 舒兰市| 鄱阳县| 宁都县| 叙永县|