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

การอนุมานชนิดข้อมูลจากสคีมา

อนุมานชนิดข้อมูลแบบคงที่โดยตรงจากสคีมา Zod

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

สคีมามีข้อมูลชนิดข้อมูล

สคีมา Zod ทราบชนิดข้อมูล TypeScript ที่สคีมานั้นใช้ตรวจสอบ z.infer จะแยกชนิดข้อมูลนั้นออกมา ทำให้คุณเขียน shape เพียง ครั้งเดียว

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User is { name: string; age: number }

ยูทิลิตี z.infer

z.infer<typeof schema> สร้างชนิดข้อมูลแบบคงที่ที่สคีมาใช้ตรวจสอบ โปรดสังเกต typeof เพราะคุณส่งค่าของสคีมาเข้าไป

import { z } from "zod";
const tagSchema = z.array(z.string());
type Tags = z.infer<typeof tagSchema>; // string[]

แหล่งข้อมูลจริงเพียงแหล่งเดียว

หากไม่มีการอนุมาน คุณจะต้องดูแลชนิดข้อมูลและสคีมาแยกจากกัน และทั้งสองอย่างอาจไม่ตรงกันได้ z.infer ทำให้ทั้งคู่สอดคล้องกันอย่างสมบูรณ์

import { z } from "zod";
const schema = z.object({ id: z.number(), email: z.string() });
type Account = z.infer<typeof schema>;
// Change the schema, the type updates automatically.

การอนุมานชนิดข้อมูลแบบซ้อน

การอนุมานรองรับออบเจ็กต์และอาร์เรย์แบบซ้อน โดยสร้างชนิดข้อมูล TypeScript แบบซ้อนทั้งหมดจากสคีมาเพียงหนึ่งตัว

import { z } from "zod";
const postSchema = z.object({
  title: z.string(),
  author: z.object({ name: z.string() }),
  tags: z.array(z.string())
});
type Post = z.infer<typeof postSchema>;
// Post.author.name is string

การใช้ชนิดข้อมูลที่อนุมานได้

ใช้ชนิดข้อมูลที่อนุมานได้ในทุกที่ที่คุณจะใช้ชนิดข้อมูลที่เขียนขึ้นเอง เช่น พารามิเตอร์ฟังก์ชัน ตัวแปร และชนิดข้อมูลผลลัพธ์

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
function greet(u: User): string {
  return "Hi " + u.name;
}

Parse คืนชนิดข้อมูลที่อนุมานได้

schema.parse จะคืนค่าที่มีชนิดข้อมูลเป็นชนิดข้อมูลที่อนุมานได้อยู่แล้ว ดังนั้นโค้ดส่วนถัดไปจึงมีชนิดข้อมูลครบถ้วน

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
const raw: unknown = { name: "Ada", age: 36 };
const user: User = userSchema.parse(raw); // typed and validated

ค่าเสริมและค่า nullable ในชนิดข้อมูล

ตัวแก้ไขสคีมาจะส่งต่อไปยังชนิดข้อมูลที่อนุมานได้ ฟิลด์ .optional() จะกลายเป็นฟิลด์เสริมใน TypeScript

import { z } from "zod";
const schema = z.object({
  name: z.string(),
  nickname: z.string().optional()
});
type P = z.infer<typeof schema>;
// P is { name: string; nickname?: string }

การอนุมานจากอาร์เรย์ของออบเจ็กต์

รวม z.array และ z.object เข้าด้วยกัน แล้วชนิดข้อมูลที่อนุมานได้จะเป็นอาร์เรย์ของชนิดข้อมูลออบเจ็กต์

import { z } from "zod";
const usersSchema = z.array(z.object({ id: z.number() }));
type Users = z.infer<typeof usersSchema>;
// Users is { id: number }[]

เหตุใดจึงต้องใช้ typeof

สคีมาคือค่า ดังนั้นคุณต้องอ้างอิงชนิดข้อมูลของสคีมาด้วย typeof schema ก่อนส่งให้ z.infer

import { z } from "zod";
const s = z.string();
type S = z.infer<typeof s>; // string
// z.infer<s> would be wrong: s is a value, not a type.

การอนุมานข้ามขอบเขตของโมดูล

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

import { z } from "zod";
export const userSchema = z.object({ name: z.string() });
export type User = z.infer<typeof userSchema>;
// Consumers import both the runtime schema and the type.

คำจำกัดความเดียว สองโลก

สคีมาทำหน้าที่ตรวจสอบระหว่างการทำงาน ส่วน z.infer ทำหน้าที่กำหนดชนิดข้อมูลขณะคอมไพล์ การประกาศเพียงครั้งเดียวจึงรองรับทั้งสองด้านและกำจัดการทำซ้ำ

import { z } from "zod";
const configSchema = z.object({ port: z.number(), host: z.string() });
type Config = z.infer<typeof configSchema>;
// Validate at runtime, type at compile time, no drift.

แบบทดสอบสั้น ๆ: การอนุมานชนิดข้อมูล

ทดสอบความเข้าใจเกี่ยวกับการอนุมานชนิดข้อมูลจากสคีมา

สรุป: การอนุมานชนิดข้อมูลจากสคีมา

คุณได้เรียนรู้ว่า z.infer<typeof schema> ใช้สร้างชนิดข้อมูล TypeScript จากสคีมา Zod ทำให้มีแหล่งข้อมูลจริงเพียงแหล่งเดียวสำหรับการตรวจสอบและชนิดข้อมูล รวมถึง shape แบบซ้อน แบบเสริม และแบบอาร์เรย์

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User stays in sync with the schema automatically.

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

บทเรียน “การอนุมานชนิดข้อมูลจากสคีมา” ฟรีหรือไม่

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

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

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

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

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

บทเรียน “การอนุมานชนิดข้อมูลจากสคีมา” ใช้เวลานานแค่ไหน

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

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

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

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

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