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

TypeScript前端數(shù)據(jù)校驗c快速上手指南

 更新時間:2026年05月18日 10:07:59   作者:伊可歷普斯  
Zod是一個以TypeScript為先的模式驗證庫,具有靜態(tài)類型推斷功能,它旨在提供強大的運行時驗證,同時充分利用TypeScript的類型系統(tǒng),這篇文章主要介紹了TypeScript前端數(shù)據(jù)校驗c快速上手的相關(guān)資料,需要的朋友可以參考下

一、Zod 是什么?

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

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

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

步驟 1:安裝

npm install zod
# 或 yarn/pnpm
pnpm add zod

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

Zod 的核心邏輯是:先定義 Schema 校驗規(guī)則 → 用 Schema 校驗數(shù)據(jù) → 自動推導 TS 類型

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

// 1. 定義校驗規(guī)則(Schema)
const UserSchema = z.object({
  // 必選字符串,非空
  username: z.string().min(2, '用戶名至少2個字符').max(20),
  // 可選數(shù)字,大于0
  age: z.number().optional().positive('年齡必須為正數(shù)'),
  // 郵箱格式校驗
  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. 校驗數(shù)據(jù)
function validateUser(data: unknown) {
  try {
    // 嚴格校驗:不符合規(guī)則會拋錯
    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: '未知錯誤' }] };
  }
}

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

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

步驟 3:項目實戰(zhàn)場景

場景 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';

// 定義表單校驗規(guī)則
const LoginSchema = z.object({
  email: z.string().email('請輸入正確的郵箱'),
  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 = () => {
  // 清空之前的錯誤
  errors.value = {};
  
  // 校驗數(shù)據(jù)(safeParse 不拋錯,返回結(jié)果)
  const result = LoginSchema.safeParse(form.value);
  if (!result.success) {
    // 格式化錯誤信息
    result.error.errors.forEach(item => {
      errors.value[item.path[0]] = item.message;
    });
    return;
  }
  
  // 校驗通過,調(diào)用接口
  console.log('表單數(shù)據(jù)合法', result.data);
};
</script>

場景 2:校驗 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
  })
);

// 請求接口并校驗響應(yīng)
async function getUserList() {
  const res = await axios.get('/api/users');
  // 校驗響應(yīng)數(shù)據(jù),確保符合預(yù)期
  const validData = UserListSchema.parse(res.data);
  return validData;
}

場景 3:校驗環(huán)境變量(Vite 項目)

// 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()
});

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

三、高頻實用 API 速查

表格

API 示例作用
z.string().min(2)字符串,最小長度 2
z.number().int()整數(shù)
z.boolean()布爾值
z.array(z.string())字符串數(shù)組
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)安全校驗,返回結(jié)果(不拋錯)
z.infer<typeof schema>從 Schema 提取 TS 類型

總結(jié)

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

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

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

您可能感興趣的文章:

相關(guān)文章

  • JavaScript如何將base64圖片轉(zhuǎn)化為URL格式

    JavaScript如何將base64圖片轉(zhuǎn)化為URL格式

    這篇文章主要給大家介紹了關(guān)于JavaScript如何將base64圖片轉(zhuǎn)化為URL格式的相關(guān)資料,Base64是一種編碼方式,而不是真正的加密方式,即使算Base64也僅用作一個簡單的加密來保護某些數(shù)據(jù),而真正的加密通常都比較繁瑣,需要的朋友可以參考下
    2023-07-07
  • JS實現(xiàn)異步上傳壓縮圖片

    JS實現(xiàn)異步上傳壓縮圖片

    這篇文章主要為大家詳細介紹了JS實現(xiàn)異步上傳壓縮圖片,并立即顯示圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 一文詳解Proxy和Object.defineProperty的使用與區(qū)別

    一文詳解Proxy和Object.defineProperty的使用與區(qū)別

    在JavaScript中,對象是一種核心的數(shù)據(jù)結(jié)構(gòu),而對對象的操作也是開發(fā)中經(jīng)常遇到的任務(wù),本文將深入比較Proxy和Object.defineProperty,感興趣的小伙伴可以了解下
    2023-12-12
  • JavaScript編寫一個簡易購物車功能

    JavaScript編寫一個簡易購物車功能

    這篇文章主要為大家詳細介紹了JavaScript簡易購物車功能的編寫代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • js中的preventDefault與stopPropagation詳解

    js中的preventDefault與stopPropagation詳解

    本篇文章主要是對js中的preventDefault與stopPropagation進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • JS實現(xiàn)圖片居中懸浮效果

    JS實現(xiàn)圖片居中懸浮效果

    這篇文章給大家分享的是通過JS實現(xiàn)圖片垂直居中懸浮,不跟隨滾動條飄動的效果,有興趣的朋友跟著學習下吧。
    2017-12-12
  • webpack打包的3種hash值詳解

    webpack打包的3種hash值詳解

    這篇文章主要為大家介紹了webpack打包的3種hash值詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 用js來解決ajax讀取頁面亂碼

    用js來解決ajax讀取頁面亂碼

    前兩天寫過服務(wù)端的,可以解決所有的瀏覽器讀取中文亂碼的問題,總是有點不爽,憋了一天,想出這個東東來,能解決firefox和ie讀中文亂碼的問題,opera不行,chome也沒測試,暫且放著吧。
    2010-11-11
  • 用javascript獲取地址欄參數(shù)

    用javascript獲取地址欄參數(shù)

    用javascript獲取地址欄參數(shù)...
    2006-12-12
  • JS中的async與await異步編程及await使用陷阱

    JS中的async與await異步編程及await使用陷阱

    這篇文章主要介紹了async與await異步編程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論

合作市| 南岸区| 湘潭县| 克东县| 宜兴市| 准格尔旗| 南昌县| 东港市| 德钦县| 准格尔旗| 张掖市| 赞皇县| 南开区| 颍上县| 金乡县| 襄樊市| 阿尔山市| 奉节县| 河池市| 崇义县| 桦甸市| 新密市| 神木县| 海原县| 抚松县| 雷山县| 太保市| 余江县| 石楼县| 满洲里市| 潮安县| 河西区| 九龙坡区| 资中县| 六枝特区| 灯塔市| 阳春市| 长治市| 敦化市| 廊坊市| 淮阳县|