infer egy conditional type-on belül használható arra, hogy egy típusból kivonjunk (kiemeljünk) egy típust egy új típusváltozóba, amelyet később felhasználhatsz. Ez a típusok mintaillesztése.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
infer egy conditional type-on belül használható arra, hogy egy típusból kivonjunk (kiemeljünk) egy típust egy új típusváltozóba, amelyet később felhasználhatsz. Ez a típusok mintaillesztése.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
Úgy olvasható: "ha T illeszkedik az U[] mintára, kötd az U-t az elem típusához, és add azt vissza." Az infer U egy helyőrzőt deklarál, amelyet a fordító a mintaillesztés alapján tölt ki.
// 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;
Egy mintán belül több infer-t is használhatsz, sőt még rekurzívan is.
Az infer a beépített típusok, mint a ReturnType, Parameters, Awaited és InstanceType mögötti motor, valamint a könyvtári trükkök mögött áll, amelyek a lekérésekből adattípusokat vagy komponensekből propokat vezetnek le.
Lehetővé teszi a típuskódnak, hogy "megnyisson" egy összetett típust és kihúzza az belső részeket — a legerősebb eszköz olyan típusok írásához, amelyek más típusokhoz igazodnak.