infer ใช้ภายในประเภท conditional type เพื่อ จับ (แยก) ประเภทจากประเภทอื่นลงในตัวแปรประเภทใหม่ที่คุณสามารถใช้ได้ มันเป็น pattern-matching สำหรับประเภท
ts
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
อ่านว่า: "หากคอนพิวเตอร์ T ตรงกับรูป U[] ให้ผูกมัด U ไปยังประเภทองค์ประกอบใดก็ตาม และส่งกลับ" infer U ประกาศตัวยึดที่คอมไพเลอร์กรอกโดยการจับคู่
// the resolved type of a Promise
type Awaited2<T> = T extends Promise<infer R> ? R : T;
type R = Awaited2<Promise<User>>; // User
// a function's return type (this is how ReturnType is built)
type MyReturn<T> = T extends (...args: any[]) => infer R ? R : never;
type X = MyReturn<() => number>; // number
// a function's first parameter
type FirstArg<T> = T extends (a: infer A, ...rest: any[]) => any ? A : never;
type UnwrapBoth<T> =
T extends Promise<infer U> ? UnwrapBoth<U> : // recurse to unwrap nested promises
T extends (infer E)[] ? E : T;
คุณสามารถใช้ infer หลายตัวในรูปแบบเดียวและแม้กระทั่งวนซ้ำได้
infer คือเครื่องจักรที่อยู่เบื้องหลังประเภทในตัว เช่น ReturnType, Parameters, Awaited และ InstanceType และเบื้องหลังเวทมนตร์ไลบรารี่ที่ได้รับประเภทการตอบสนองจากตัวดึงข้อมูล หรือ props จากองค์ประกอบ
มันช่วยให้รหัสประเภท "เปิด" ประเภทที่ซับซ้อนและดึงชิ้นส่วนภายในออกมา — เครื่องมือที่มีประสิทธิภาพที่สุดสำหรับการเขียนประเภทที่ปรับให้เข้ากับประเภทอื่นๆ