infer تُستخدم داخل conditional type لـ التقاط (استخراج) نوع من داخل نوع آخر إلى متغير نوع جديد يمكنك استخدامه بعد ذلك. إنها pattern-matching للأنواع.
ts
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
اقرأها كالتالي: "إذا كان T يطابق النمط U[]، ربط U بأيًا كان نوع العنصر، وأرجعه." infer U تُعلّن عن placeholder يملأها المترجم من خلال المطابقة.
// 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;
يمكنك استخدام عدة infers في نمط واحد وحتى العودية.
infer هي محرك الأنواع المدمجة مثل ReturnType و Parameters و Awaited و InstanceType، وخلف السحر المكتبي الذي يستمد أنواع الاستجابة من الجلبين أو الخصائص من المكونات.
تسمح لرمز النوع "بفتح" نوع معقد واستخراج الأجزاء الداخلية — الأداة الأقوى لكتابة أنواع تتكيف مع أنواع أخرى.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع