infer გამოიყენება conditional type-ის შიგნით, რომ ჩაჭიდოს (ამოიღოს) ტიპი სხვა ტიპის შიგნიდან ახალ ტიპის ცვლადში, რომელსაც შემდეგ გამოიყენებთ. ეს არის pattern-matching ტიპებისთვის.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
კითხულობთ: "თუ T ემთხვევა U[] ნიმუშს, შეაბამეთ U ელემენტის ტიპს, და დააბრუნეთ." infer U აცხადებს placeholder-ს, რომელიც compiler-ი ავსებს pattern matching-ის საშუალებით.
// 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, და library magic-ის გამოცემული ტიპებისთვის, რომელიც იღებს response ტიპებს fetcher-ებიდან ან props-ებს component-ებიდან.
ეს საშუალებას აძლევს ტიპის კოდს "გახსნას" რთული ტიპი და გამოიღოს შიგნითი ნაწილები — ყველაზე მძლავრი ინსტრუმენტი ტიპების დასაწერად, რომელიც ადაპტირდება სხვა ტიპებთან.