Skip to content

TypeScript-generics forklaret

De generics-mønstre, du griber efter, grupperet efter job: erklær en typeparameter, begræns den, giv den en standardværdi, forgren med en betinget type, indfang med infer, og map over en form. Hver række parrer mønsteret med et eksempel på én linje.

En generic er en typeparameter: en pladsholder for en type, som kalderen vælger, så én funktion eller type virker for mange former uden at miste præcision. Læs <T> som „for en eller anden type T“. Kraften kommer fra at begrænse T, forgrene på den og mappe over den. Mønstrene nedenfor er arbejdsvokabularet.

Referencetabel · 28 poster
28 of 28 rows
Erklær
En typeparameter, som kalderen vælger.function first<T>(xs: T[]): T
Flere uafhængige typeparametre.function pair<T, U>(a: T, b: U): [T, U]
En anden parameter knyttet til nøglerne i den første.function get<T, K extends keyof T>(o: T, k: K): T[K]
En klasse med en typeparameter på sine felter og metoder.class Box<T> { value: T }
En objektform med en typeparameter.interface Result<T> { data: T }
En typeparameter på en arrow-funktion; det afsluttende komma forhindrer .tsx-filer i at læse den som JSX.const first = <T,>(xs: T[]): T => xs[0]
Begræns
Kræver, at T kan tildeles Type.function len<T extends { length: number }>(x: T)
Begrænser T til en nøgle i en anden type.type Keys<O> = keyof O
Begrænser T til en klasse, der kan konstrueres med new.function make<C extends new () => C>(c: C): C
Kræver, at T opfylder flere begrænsninger på én gang.function log<T extends Error & { code: number }>(e: T)
Begrænser til hvad som helst; holder parameteren generisk uden at indsnævre den.type Wrap<T> = T extends unknown ? { v: T } : never
Standardværdi & infer
Giver T en standardværdi, når kalderen udelader den.function parse<T = string>(): T
Indfanger en type inde i en betinget type.type El<T> = T extends Array<infer I> ? I : never
Pakker en indlejret Promise ud til sin indre type.type Data = Awaited<Promise<User>>
Indfanger et stykke af en template literal-type.type Path<S> = S extends `/api/${infer R}` ? R : never
Tjekker hele unionen på én gang; en nøgen T infererer ét medlem ad gangen.type El<T> = [T] extends [Array<infer I>] ? I : never
Betingede og mappede typer
Vælger en type ud fra, om T kan tildeles U.type IsStr<T> = T extends string ? true : false
Bygger en ny objekttype ved at transformere hver nøgle i T.type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Et objekt, hvis nøgler er K, og hvis værdier er V.type Scores = Record<string, number>
Indbyggede generics afledt af mønstrene ovenfor.type Preview = Pick<User, "id" | "name">
En nøgen T før extends kører én gang pr. unionsmedlem og forener resultaterne.ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Tilføjer eller fjerner modifikatorer på mappede nøgler.type Req<T> = { [K in keyof T]-?: T[K] }
Nøglerne i en runtime-værdi, som en type.const opts = { a: 1 }; type K = keyof typeof opts
Bygger en string-type ud fra andre string-typer.type Route = `/users/${string}`
Sammenkæder tuple-typer ende til ende.type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
En type, hvis definition henviser til sig selv.type Json = string | number | Json[] | { [k: string]: Json }
Tjekker en værdi mod en type og beholder dens snævrere literal-type.const c = { dark: "#000" } satisfies Record<string, string>
Beholder kalderens literal-type i stedet for at udvide den (TS 5.0).function first<const T>(xs: readonly T[]): T