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

รูปแบบการอนุมานชนิดที่ซ้อนกันลึก

ประยุกต์ใช้ infer แบบเรียกซ้ำเพื่อดึงชนิดที่ซับซ้อน

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

เหตุใดจึงต้องอนุมานเชิงลึก

บางครั้งชนิดข้อมูลที่คุณต้องการถูกซ่อนอยู่ภายใน泛型หลายชั้น การอนุมานเชิงลึกใช้ชนิดข้อมูลแบบมีเงื่อนไขแบบเวียนเกิดหรือแบบต่อเนื่องเพื่อเข้าถึงชนิดข้อมูลนั้น

type DeepUnwrap<T> =
  T extends Promise<infer U>
    ? DeepUnwrap<U>
    : T;

type A = DeepUnwrap<Promise<Promise<string>>>; // string

ชนิดข้อมูลแบบมีเงื่อนไขแบบเวียนเกิด

TypeScript 4.1 ขึ้นไปรองรับชนิดข้อมูลแบบมีเงื่อนไขแบบเวียนเกิด ทำให้คุณสามารถลอกชั้นตัวห่อหุ้มออกทีละชั้นได้

type Flatten<T> = T extends Array<infer U> ? Flatten<U> : T;
type B = Flatten<string[][][]>; // string

การอนุมานจาก泛型ที่ซ้อนกัน

คุณสามารถเชื่อมตัวแปรการอนุมานหลายตัวไว้ในส่วนคำสั่ง extends เดียว เพื่อจับหลายชั้นได้พร้อมกัน

type InnerValue<T> =
  T extends Map<any, infer V>
    ? V extends Set<infer S>
      ? S
      : V
    : T;
type C = InnerValue<Map<string, Set<number>>>; // number

ชนิดข้อมูลคุณสมบัติของออบเจ็กต์เชิงลึก

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

type DeepGet<T, K extends keyof T> =
  T[K] extends object ? T[K] : never;

type Nested = { user: { profile: { name: string } } };
type Profile = DeepGet<Nested, "user">; // { profile: { name: string } }

การแยกชนิดข้อมูลสมาชิกอาร์เรย์เชิงลึก

การรวมการแกะตัวห่อหุ้มแบบเวียนเกิดเข้ากับการจัดการอาร์เรย์ ช่วยรองรับการซ้อนกันได้ทุกระดับ

type ElementType<T> = T extends (infer U)[] ? ElementType<U> : T;
type D = ElementType<number[][][]>; // number

การเวียนเกิดส่วนท้ายของทูเพิล

การจัดการทูเพิลแบบเวียนเกิดส่วนท้ายเป็นรูปแบบที่ใช้กันทั่วไปสำหรับไปป์ไลน์ที่ปลอดภัยด้านชนิดข้อมูลและชนิดข้อมูลการประกอบฟังก์ชัน

type Last<T extends any[]> =
  T extends [...infer _, infer L] ? L : never;
type E = Last<[1, 2, 3]>; // 3

ขีดจำกัดความลึกและข้อควรพิจารณาในการใช้งานจริง

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

// Deep recursion may hit "Type instantiation is excessively deep"
// Simplify or use branded types to break deep chains

การอนุมานในการแจกแจงยูเนียน

เมื่อ T เป็นยูเนียน ชนิดข้อมูลแบบมีเงื่อนไขจะแจกแจง โดยจับคู่สมาชิกแต่ละตัวแยกกัน แล้วรวมผลลัพธ์เป็นยูเนียน

type Unwrap<T> = T extends Promise<infer U> ? U : T;
type F = Unwrap<Promise<string> | Promise<number> | boolean>;
// string | number | boolean

การอนุมานทูเพิลส่วนที่เหลือ

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

type Init<T extends any[]> =
  T extends [...infer I, any] ? I : never;
type G = Init<[1, 2, 3, 4]>; // [1, 2, 3]

ตัวอย่างจากการใช้งานจริง: ผลลัพธ์ API ที่ซ้อนกัน

คุณสามารถแกะชนิดข้อมูลผลลัพธ์ API ที่ซ้อนกันจนได้ชนิดข้อมูลของข้อมูล โดยใช้การอนุมานที่เชื่อมต่อกัน

type ApiResponse<T> = { data: T; status: number };
type UnwrapApi<T> = T extends ApiResponse<infer D> ? D : T;
type H = UnwrapApi<ApiResponse<{ users: string[] }>>; // { users: string[] }

สรุป: การอนุมานเชิงลึก

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

ตรวจสอบอย่างรวดเร็ว

Flatten คืนค่าอะไร หาก Flatten = T extends Array ? Flatten : T

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

การอนุมานชนิดข้อมูลที่ซ้อนกันอย่างลึกใช้ชนิดข้อมูลแบบมีเงื่อนไขแบบเวียนเกิดและรูปแบบการอนุมานที่เชื่อมต่อกัน เพื่อเข้าถึงชนิดข้อมูลที่ซ่อนอยู่ภายในตัวห่อหุ้ม泛型หลายชั้น ควรจำกัดการเวียนเกิดเพื่อหลีกเลี่ยงขีดจำกัดความลึกของ TypeScript

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

บทเรียน “รูปแบบการอนุมานชนิดที่ซ้อนกันลึก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบการอนุมานชนิดที่ซ้อนกันลึก”

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

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

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

บทเรียน “รูปแบบการอนุมานชนิดที่ซ้อนกันลึก” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ทำความเข้าใจ infer ในชนิดแบบมีเงื่อนไข
  2. สร้าง ReturnType และ Parameters ตั้งแต่ต้น
  3. รูปแบบการอนุมานชนิดที่ซ้อนกันลึก
  4. กรณีใช้งาน infer ในทางปฏิบัติ: การคลายห่อ Promise
← กลับไปที่ TypeScript Academy