Generics-mønstrene du bruker mest, gruppert etter jobb: deklarer en typeparameter, begrens den, gi den standardverdi, forgren med en betinget type, fang opp med infer, og kartlegg en form. Hver rad kobler mønsteret med et eksempel på én linje.
En generic er en typeparameter: en plassholder for en type som kalleren velger, slik at én funksjon eller type fungerer for mange former uten å miste presisjon. Les <T> som «for en type T». Kraften ligger i å begrense T, forgrene på den og kartlegge over den. Mønstrene nedenfor er arbeidsvokabularet.
Referansetabell · 28 oppføringer
Generics i TypeScriptExplained
28 of 28 rows
Deklarer
En typeparameter som kalleren velger.
function first<T>(xs: T[]): T
Flere uavhengige typeparametere.
function pair<T, U>(a: T, b: U): [T, U]
En andreparameter knyttet til nøklene til den første.
function get<T, K extends keyof T>(o: T, k: K): T[K]
En klasse med en typeparameter på feltene og metodene sine.
class Box<T> { value: T }
En objektform med en typeparameter.
interface Result<T> { data: T }
En typeparameter på en arrow-funksjon; det etterfølgende kommaet hindrer .tsx-filer i å lese den som JSX.
const first = <T,>(xs: T[]): T => xs[0]
Begrens
Krev at T kan tilordnes Type.
function len<T extends { length: number }>(x: T)
Begrens T til en nøkkel av en annen type.
type Keys<O> = keyof O
Begrens T til en klasse som kan konstrueres.
function make<C extends new () => C>(c: C): C
Krev at T oppfyller flere begrensninger samtidig.
function log<T extends Error & { code: number }>(e: T)
Begrens til hva som helst; holder parameteren generisk uten å snevre den inn.
type Wrap<T> = T extends unknown ? { v: T } : never
Standardverdi og infer
Gi T en standardverdi når kalleren utelater den.
function parse<T = string>(): T
Fang opp en type inne i en betinget.
type El<T> = T extends Array<infer I> ? I : never
Pakk ut en nestet Promise til sin indre type.
type Data = Awaited<Promise<User>>
Fang opp én del av en mal-literal-type.
type Path<S> = S extends `/api/${infer R}` ? R : never
Sjekk hele unionen på én gang; en naken T utleder ett medlem om gangen.
type El<T> = [T] extends [Array<infer I>] ? I : never
Betingede og kartlagte typer
Velg en type basert på om T kan tilordnes U.
type IsStr<T> = T extends string ? true : false
Bygg en ny objekttype ved å transformere hver nøkkel i T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Et objekt der nøklene er K og verdiene er V.
type Scores = Record<string, number>
Innebygde generics utledet fra mønstrene ovenfor.
type Preview = Pick<User, "id" | "name">
En naken T før extends kjøres én gang per unionsmedlem og forener resultatene.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Legg til eller fjern modifikatorer på kartlagte nøkler.
type Req<T> = { [K in keyof T]-?: T[K] }
Nøklene til en kjøretidsverdi, som en type.
const opts = { a: 1 }; type K = keyof typeof opts
Bygg en strengtype fra andre strengtyper.
type Route = `/users/${string}`
Sett sammen tuple-typer ende til ende.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
En type der definisjonen viser til seg selv.
type Json = string | number | Json[] | { [k: string]: Json }
Sjekk en verdi mot en type og behold dens smalere literaltype.
const c = { dark: "#000" } satisfies Record<string, string>
Behold kallerens literaltype i stedet for å utvide den (TS 5.0).