infer naudojamas sąlyginiam tipui žymėti (išskirti) tipą iš kito tipo į naują tipo kintamąjį, kurį vėliau galite naudoti. Tai yra pattern-matching tipams.
ts
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
Skaitykite taip: "jei T atitinka šabloną U[], susieti U su elementų tipu ir grąžinti." infer U deklaruoja placeholder'į, kurį kompiliatorius užpildo atitikdamas šabloną.
// 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;
Jūs galite naudoti kelis infer'us viename šablone ir net rekursyviai.
infer yra variklinis mechanizmas į veikiančius tipus, tokius kaip ReturnType, Parameters, Awaited ir InstanceType, ir į bibliotekos "magiją", kuri išveda atsakymo tipus iš gaunytojų ar savybių iš komponentų.
Jis leidžia tipo kodui "atidaryti" sudėtingą tipą ir ištraukti vidinių dalių — galingiausias įrankis rašyti tipus, kurie prisitaiko prie kitų tipų.