รูปแบบการอนุมานชนิดที่ซ้อนกันลึก
ประยุกต์ใช้ 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
สิ่งที่คุณได้เรียนรู้
การอนุมานชนิดข้อมูลที่ซ้อนกันอย่างลึกใช้ชนิดข้อมูลแบบมีเงื่อนไขแบบเวียนเกิดและรูปแบบการอนุมานที่เชื่อมต่อกัน เพื่อเข้าถึงชนิดข้อมูลที่ซ่อนอยู่ภายในตัวห่อหุ้ม泛型หลายชั้น ควรจำกัดการเวียนเกิดเพื่อหลีกเลี่ยงขีดจำกัดความลึกของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทำความเข้าใจ infer ในชนิดแบบมีเงื่อนไข
- สร้าง ReturnType และ Parameters ตั้งแต่ต้น
- รูปแบบการอนุมานชนิดที่ซ้อนกันลึก
- กรณีใช้งาน infer ในทางปฏิบัติ: การคลายห่อ Promise