infer käytetään conditional type -sisällä kaappaamaan (poimimaan) tyyppi toisesta tyypistä uuteen tyyppmuuttujaan, jota voit sitten käyttää. Se on pattern-matching tyypeille.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
Lue se näin: "jos T vastaa mallia U[], sido U mihin tahansa elementtityyppi on, ja palauta se." infer U ilmoittaa paikkamerkin, jonka kääntäjä täyttää vastaavuudella.
// 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;
Voit käyttää useita infers yhdessä mallissa ja jopa rekursio.
infer on sisäänrakennettujen tyyppien kuten ReturnType, Parameters, Awaited ja InstanceType taustalla oleva moottori, ja kirjaston magian taustalla, joka johtaa vasteistyyppejä noutajista tai prop-tietoja komponenteista.
Sen avulla tyyppikoodi voi "avata" monimutkaisen tyypin ja vetää sisäosien palat ulos — tehokkain työkalu kirjoitettaessa tyyppejä, jotka sopeutuvat muihin tyyppeihin.
Kirjasto IT-haastattelukysymyksiä yksityiskohtaisine vastauksineen — Juniorista Senioriin.
Lahjoita