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

parse เทียบกับ safeParse

จัดการผลสำเร็จและล้มเหลวของการตรวจสอบอย่างเหมาะสม

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

สองวิธีในการตรวจสอบ

Zod มีเมธอดตรวจสอบสองแบบ ได้แก่ parse ซึ่งจะแจ้งข้อผิดพลาดเมื่อข้อมูลไม่ถูกต้อง และ safeParse ซึ่งจะคืนออบเจ็กต์ผลลัพธ์แทน

import { z } from "zod";
const schema = z.string();
// schema.parse(x) throws on failure
// schema.safeParse(x) returns { success, ... }

parse แจ้งข้อผิดพลาดเมื่อข้อมูลไม่ถูกต้อง

parse จะคืนค่าที่ตรวจสอบแล้วเมื่อสำเร็จ และแจ้ง ZodError เมื่อไม่สำเร็จ จึงเหมาะเมื่อข้อมูลที่ไม่ถูกต้องถือเป็นกรณีผิดปกติอย่างแท้จริง

import { z } from "zod";
const schema = z.number();
const ok = schema.parse(42); // 42
// schema.parse("nope"); // throws ZodError

การดักจับข้อผิดพลาดจาก Parse

ห่อ parse ไว้ใน try/catch เพื่อจัดการข้อผิดพลาดที่ถูกแจ้ง แล้วตรวจสอบรายละเอียดว่าเกิดความล้มเหลวที่จุดใด

import { z } from "zod";
const schema = z.number();
try {
  schema.parse("nope");
} catch (err) {
  if (err instanceof z.ZodError) {
    console.log("Invalid:", err.issues.length);
  }
}

safeParse คืนผลลัพธ์

safeParse จะไม่แจ้งข้อผิดพลาด แต่จะคืนออบเจ็กต์ที่มี success: true และ data หรือ success: false และ error

import { z } from "zod";
const schema = z.number();
const result = schema.safeParse("nope");
// result is { success: false, error: ZodError }

การจำกัดชนิดของผลลัพธ์

ผลลัพธ์เป็นยูเนียนแบบมีตัวแยกตามค่า success การตรวจสอบค่านี้จะจำกัดผลลัพธ์ให้เหลือ data หรือ error อย่างใดอย่างหนึ่ง

import { z } from "zod";
const schema = z.object({ id: z.number() });
const result = schema.safeParse({ id: 1 });
if (result.success) {
  console.log(result.data.id); // typed
} else {
  console.log(result.error.issues);
}

ควรใช้ parse เมื่อใด

ใช้ parse เมื่ออินพุตที่ไม่ถูกต้องเป็นข้อผิดพลาดของโปรแกรมหรือควรทำให้การดำเนินการยุติลง เช่น การอ่าน config ที่จำเป็นเมื่อเริ่มต้นโปรแกรม

import { z } from "zod";
const configSchema = z.object({ port: z.number() });
const config = configSchema.parse({ port: 8080 });
// Fail fast if config is wrong.

ควรใช้ safeParse เมื่อใด

ใช้ safeParse เมื่อคาดว่าอินพุตอาจไม่ถูกต้องและคุณต้องการจัดการอย่างเหมาะสม เช่น การตรวจสอบข้อมูลที่ส่งจากฟอร์มของผู้ใช้

import { z } from "zod";
const formSchema = z.object({ email: z.string() });
const r = formSchema.safeParse({ email: 123 });
if (!r.success) {
  // Show a friendly validation message
}

การอ่านปัญหาจาก ZodError

ZodError มีอาร์เรย์ issues ที่อธิบายปัญหาแต่ละรายการ ได้แก่ เส้นทาง ข้อความ และรหัสข้อผิดพลาด

import { z } from "zod";
const schema = z.object({ age: z.number() });
const r = schema.safeParse({ age: "x" });
if (!r.success) {
  for (const issue of r.error.issues) {
    console.log(issue.path, issue.message);
  }
}

ทั้งสองแบบคืนชนิดข้อมูลที่อนุมานได้

เมื่อสำเร็จ เมธอดทั้งสองจะแจ้งค่าที่ตรวจสอบแล้วซึ่งมีชนิดข้อมูลเป็น z.infer<typeof schema> ดังนั้นโค้ดส่วนถัดไปจึงมีชนิดข้อมูลครบถ้วน

import { z } from "zod";
const userSchema = z.object({ name: z.string() });
type User = z.infer<typeof userSchema>;
const u: User = userSchema.parse({ name: "Ada" });
console.log(u.name);

การเลือกเมธอดที่เหมาะสม

หลักง่าย ๆ คือใช้ parse กับเส้นทางการทำงานที่เชื่อถือได้หรือมีความสำคัญ ซึ่งความล้มเหลวควรหยุดการทำงาน และใช้ safeParse กับอินพุตที่ไม่เชื่อถือได้ซึ่งต้องจัดการโดยไม่ทำให้โปรแกรมหยุดทำงาน

import { z } from "zod";
const schema = z.string();
// Critical: schema.parse(value)
// User-facing: schema.safeParse(value)

การผสานรูปแบบทั้งสอง

รูปแบบที่พบได้บ่อยคือห่อ safeParse ไว้ในฟังก์ชันช่วยเหลือที่คืนข้อมูลซึ่งมีชนิดข้อมูลครบถ้วนหรือข้อผิดพลาดที่จัดรูปแบบแล้ว ทำให้ได้ความสะดวกของทั้งสองเมธอด

import { z } from "zod";
function validate<T extends z.ZodType>(schema: T, value: unknown) {
  const r = schema.safeParse(value);
  return r.success ? { ok: true, data: r.data } : { ok: false, error: r.error };
}
// Reusable, no throwing.

แบบทดสอบสั้น ๆ: parse กับ safeParse

ทดสอบความเข้าใจเกี่ยวกับ parse และ safeParse

สรุป: parse กับ safeParse

คุณได้เรียนรู้ว่า parse จะแจ้งข้อผิดพลาดเมื่อข้อมูลไม่ถูกต้อง ขณะที่ safeParse จะคืนผลลัพธ์แบบ success/error รวมถึงได้เรียนรู้ว่าแต่ละแบบควรใช้เมื่อใดและวิธีอ่านปัญหาจาก ZodError

import { z } from "zod";
const schema = z.object({ id: z.number() });
const r = schema.safeParse({ id: 1 });
if (r.success) console.log(r.data.id);

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

บทเรียน “parse เทียบกับ safeParse” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “parse เทียบกับ safeParse”

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

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

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

บทเรียน “parse เทียบกับ safeParse” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐานสคีมา Zod
  2. การอนุมานชนิดข้อมูลจากสคีมา
  3. parse เทียบกับ safeParse
  4. การประกอบและปรับแต่งสคีมา
← กลับไปที่ TypeScript Academy