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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- DeepPartial และ DeepReadonly
- ยูทิลิตี Flatten และ UnwrapPromise
- TupleToUnion และ UnionToIntersection
- การเผยแพร่ไลบรารีอรรถประโยชน์ด้านชนิด