0Pricing
TypeScript Academy · บทเรียน

สคีมา zod/valibot และการอนุมานชนิด

ตรวจสอบข้อมูลที่ไม่น่าเชื่อถือด้วยสคีมา อนุมานชนิด TS โดยตรงจากตัวตรวจสอบ เปรียบเทียบ zod กับ valibot และเชื่อมต่อเข้ากับตัวจัดการ

สคีมา zod/valibot และการอนุมานชนิด เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 2 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 2 บทเรียน

บทนำ

เป้าหมาย: ถือว่าอินพุตภายนอกเป็น unknown ตรวจสอบด้วยสคีมา และ อนุมานชนิด TS จากสคีมานั้น คุณจะใช้ zod ดูไวยากรณ์ของ valibot และสร้างตัวช่วยขนาดเล็กสำหรับตัวจัดการ

  • แหล่งข้อมูลจริงเพียงแหล่งเดียว
  • safeParse เทียบกับ parse
  • นำชนิดที่อนุมานแล้วกลับมาใช้ซ้ำ

การอนุมานด้วย zod

กำหนดสคีมาเพียงครั้งเดียว type User = z.infer<typeof userSchema> จะสะท้อนกฎการตรวจสอบได้ตรงกันทุกประการ

import { z } from "zod"

export const userSchema = z.object({
  id: z.string().uuid(),
  name: z.string().min(1),
  age: z.number().int().min(0).optional()
})

export type User = z.infer<typeof userSchema>

// User is kept in sync with runtime rules.

safeParse เทียบกับ parse

safeParse ให้ผลลัพธ์ว่าสำเร็จหรือล้มเหลวโดยไม่โยนข้อผิดพลาด จึงเหมาะอย่างยิ่งสำหรับตัวจัดการ HTTP ส่วน parse จะโยนข้อผิดพลาดเมื่ออินพุตไม่ถูกต้อง

import type { Request, Response } from "express"
import { userSchema, type User } from "./schema"

export function createUser(req: Request, res: Response<User | { error: string; issues?: unknown }>) {
  const r = userSchema.safeParse(req.body)
  if (!r.success) {
    return res.status(400).json({ error: "Invalid body", issues: r.error.format() })
  }
  const user = r.data
  return res.status(201).json(user)
}

// parse() throws; safeParse() returns a discriminated union

การอนุมานด้วย valibot

valibot มีตัวตรวจสอบขนาดกะทัดรัดพร้อม Infer<typeof schema> เลือกไลบรารีหนึ่งรายการและใช้มาตรฐานเดียวกันทั้งทีม

import { object, string, number, optional, minLength, uuid, minValue } from "valibot"
import type { Infer } from "valibot"

export const VUser = object({
  id: string([uuid()]),
  name: string([minLength(1)]),
  age: optional(number([minValue(0)]))
})

export type VUserT = Infer<typeof VUser>

// Similar idea: one schema, inferred type.

ตัวช่วยตรวจสอบ

ห่อการแยกวิเคราะห์ไว้ในตัวช่วยขนาดเล็ก เพื่อให้ตัวจัดการได้รับโครงสร้างอย่างง่ายระหว่าง { ok,data } กับ { ok:false,issues }

import { ZodTypeAny } from "zod"

export function validate<T extends ZodTypeAny, Out = unknown>(schema: T, value: unknown, onError?: (issues: unknown) => never | void): { ok: true; data: Out } | { ok: false; issues: unknown } {
  const r = schema.safeParse(value)
  if (!r.success) {
    const issues = r.error.format()
    if (onError) onError(issues as unknown as never)
    return { ok: false, issues }
  }
  return { ok: true, data: r.data as unknown as Out }
}

เคล็ดลับ

เคล็ดลับ:

  • วางสคีมาไว้ใกล้ขอบเขตระบบ (HTTP, CLI, DB IO)
  • อนุมานชนิดแล้วส่งออกไปใช้ หลีกเลี่ยงการเขียนซ้ำด้วยตนเอง
  • ส่งกลับ 400 พร้อมรายละเอียดของปัญหา อย่าเชื่อถืออินพุตจากไคลเอนต์โดยไม่ตรวจสอบ

การตรวจสอบประโยชน์ของการอนุมาน

ตรวจสอบอย่างรวดเร็ว: เหตุใดจึงควรอนุมานชนิดจากสคีมา

สรุปทบทวน

สรุปทบทวน: ตรวจสอบอินพุต unknown ด้วย zod/valibot ใช้ safeParse และ อนุมานชนิดเพื่อให้การตรวจสอบระหว่างคอมไพล์และขณะทำงานสอดคล้องกัน

คำถามที่พบบ่อย

บทเรียน “สคีมา zod/valibot และการอนุมานชนิด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สคีมา zod/valibot และการอนุมานชนิด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 2 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สคีมา zod/valibot และการอนุมานชนิด”

ตรวจสอบข้อมูลที่ไม่น่าเชื่อถือด้วยสคีมา อนุมานชนิด TS โดยตรงจากตัวตรวจสอบ เปรียบเทียบ zod กับ valibot และเชื่อมต่อเข้ากับตัวจัดการ คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 2 บทเรียน

บทเรียน “สคีมา zod/valibot และการอนุมานชนิด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม

ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สคีมา zod/valibot และการอนุมานชนิด
  2. การแยกวิเคราะห์เชิงป้องกันและซองข้อผิดพลาด
← กลับไปที่ TypeScript Academy