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

DeepPartial และ DeepReadonly

สร้าง Partial และ Readonly แบบเรียกซ้ำ

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

เหตุใดจึงต้องใช้ชนิดยูทิลิตีแบบลึก

Partial และ Readonly ในตัวจะใช้ได้ลึกเพียงหนึ่งระดับเท่านั้น สำหรับออบเจ็กต์ที่ซ้อนกัน คุณจึงต้องใช้เวอร์ชันแบบเรียกซ้ำ

interface Config {
  db: { host: string; port: number };
  app: { name: string };
}
type Shallow = Partial<Config>;
// Shallow.db is still required — only top level is optional

การสร้าง DeepPartial

แมปคุณสมบัติของออบเจ็กต์แบบเรียกซ้ำ ทำให้แต่ละคุณสมบัติเป็นตัวเลือก และใช้ DeepPartial แบบเรียกซ้ำหากค่าของคุณสมบัติเป็นออบเจ็กต์

type DeepPartial<T> = T extends object
  ? { [K in keyof T]?: DeepPartial<T[K]> }
  : T;

DeepPartial ในการใช้งาน

ใช้ DeepPartial กับชนิดการกำหนดค่าแบบซ้อนกัน แล้วดูว่าทุกระดับกลายเป็นตัวเลือก

type PartialConfig = DeepPartial<Config>;
// PartialConfig.db?: { host?: string; port?: number }

const c: PartialConfig = { db: { host: "localhost" } };
// No error — all other fields are optional

การสร้าง DeepReadonly

ทำให้ทุกคุณสมบัติในทุกระดับเป็น readonly โดยสำรวจเข้าไปในชนิดออบเจ็กต์ที่ซ้อนกันแบบเรียกซ้ำ

type DeepReadonly<T> = T extends object
  ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
  : T;

DeepReadonly ในการใช้งาน

การกำหนดค่าที่ถูกทำให้หยุดการแก้ไขในทุกระดับจะไม่สามารถเปลี่ยนแปลงได้ในระดับใดเลย

type ReadonlyConfig = DeepReadonly<Config>;
const cfg: ReadonlyConfig = { db: { host: "localhost", port: 5432 }, app: { name: "my-app" } };
// cfg.db.port = 3000; // Error: readonly

การจัดการอาร์เรย์ในชนิดแบบลึก

อาร์เรย์ต้องจัดการเป็นกรณีพิเศษ ให้แมปชนิดของสมาชิกแบบเรียกซ้ำ แทนที่จะถือว่าอาร์เรย์เป็นออบเจ็กต์ทั่วไป

type DeepPartial<T> =
  T extends (infer U)[]
    ? DeepPartial<U>[]
    : T extends object
      ? { [K in keyof T]?: DeepPartial<T[K]> }
      : T;

การจัดการชนิดพื้นฐาน

กรณีฐานของการเรียกซ้ำต้องส่งคืนชนิดพื้นฐานตามเดิม ไม่ใช่ห่อไว้ในชนิดที่แมปจากออบเจ็กต์

type DeepReadonly<T> =
  T extends string | number | boolean | null | undefined ? T
  : T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>>
  : { readonly [K in keyof T]: DeepReadonly<T[K]> };

การผสาน DeepPartial และ DeepReadonly

คุณสามารถผสานทั้งสองชนิดเพื่อสร้างชนิดที่เป็นบางส่วนและอ่านได้อย่างเดียวแบบลึก สำหรับการปรับแพตช์การกำหนดค่าอย่างปลอดภัย

type SafePatch<T> = DeepReadonly<DeepPartial<T>>;

ข้อควรพิจารณาด้านประสิทธิภาพ

ชนิดแบบเรียกซ้ำบนออบเจ็กต์ขนาดใหญ่มากอาจทำให้การตรวจสอบชนิดของ TypeScript ช้าลง ลองพิจารณากำหนดขีดจำกัดความลึกหรือใช้การประเมินแบบขี้เกียจสำหรับโค้ดที่ต้องให้ความสำคัญกับประสิทธิภาพ

// For very deep schemas, consider using Zod or io-ts
// which provide runtime + compile-time deep typing

การใช้งานจริง: แพตช์สถานะ React

DeepPartial เหมาะอย่างยิ่งสำหรับฟังก์ชันแพตช์สถานะที่รับเฉพาะส่วนของออบเจ็กต์สถานะขนาดใหญ่ที่มีการเปลี่ยนแปลง

function patch<T>(state: T, changes: DeepPartial<T>): T {
  return { ...state, ...changes } as T;
}

ทบทวน: ชนิดยูทิลิตีแบบลึก

DeepPartial และ DeepReadonly เป็นชนิดที่แมปแบบเรียกซ้ำ ซึ่งใช้ตัวปรับแต่งกับทุกระดับของออบเจ็กต์ที่ซ้อนกัน ให้จัดการอาร์เรย์แยกต่างหาก และใช้กรณีฐานสำหรับชนิดพื้นฐาน

ตรวจสอบความเข้าใจ

กรณีฐานแบบเรียกซ้ำที่ถูกต้องสำหรับ DeepPartial คืออะไร

สิ่งที่ได้เรียนรู้

คุณได้สร้าง DeepPartial และ DeepReadonly โดยใช้ชนิดที่แมปแบบเรียกซ้ำ ให้จัดการอาร์เรย์เป็นกรณีพิเศษ และส่งคืนชนิดพื้นฐานโดยไม่เปลี่ยนแปลงเสมอในกรณีฐาน

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

บทเรียน “DeepPartial และ DeepReadonly” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “DeepPartial และ DeepReadonly”

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

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

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

บทเรียน “DeepPartial และ DeepReadonly” ใช้เวลานานแค่ไหน

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

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

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

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

  1. DeepPartial และ DeepReadonly
  2. ยูทิลิตี Flatten และ UnwrapPromise
  3. TupleToUnion และ UnionToIntersection
  4. การเผยแพร่ไลบรารีอรรถประโยชน์ด้านชนิด
← กลับไปที่ TypeScript Academy