สคีมา 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สคีมา zod/valibot และการอนุมานชนิด
- การแยกวิเคราะห์เชิงป้องกันและซองข้อผิดพลาด