infer se uporablja znotraj conditional type za uhvatitev (ekstrakcijo) tipa znotraj drugega tipa v novo spremenljivko tipa, ki jo nato lahko uporabite. To je ujemanje vzorcev za tipe.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
Preberite kot: "če se T ujema z vzorcem U[], vežite U na kar je vrsta elementa in jo vrnite." infer U deklarira rezervirano mesto, ki ga kompilator izpolni z ujemanjem vzorcev.
// 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;
V enem vzorcu lahko uporabite več infer-ov in celo rekurzijo.
infer je pogon za vgrajenimi tipi, kot so ReturnType, Parameters, Awaited in InstanceType, ter za bibliotečno магиjо, ki izpelje vrste odgovora iz fetcher-jev ali lastnosti iz komponent.
Omogoča kodi tipov, da "odpre" zapleten tip in ekstrahira notranje dele — najbolj zmogljivo orodje za pisanje tipov, ki se prilagajajo drugim tipom.