Skip to content

Generics w TypeScript wyjaśnione

Wzorce generics, po które sięgasz, pogrupowane według zadania: zadeklaruj parametr typu, ogranicz go, nadaj wartość domyślną, rozgałęź typem warunkowym, przechwyć przez infer i zmapuj kształt. Każdy wiersz łączy wzorzec z jednolinijkowym przykładem.

Generic to parametr typu: symbol zastępczy typu wybieranego przez wywołującego, dzięki czemu jedna funkcja lub typ działa dla wielu kształtów bez utraty precyzji. Czytaj <T> jako „dla pewnego typu T”. Moc płynie z ograniczania T, rozgałęziania na nim i mapowania po nim. Wzorce poniżej to robocze słownictwo.

Tabela referencyjna · 28 wpisy
28 of 28 rows
Deklaracja
Parametr typu wybierany przez wywołującego.function first<T>(xs: T[]): T
Kilka niezależnych parametrów typu.function pair<T, U>(a: T, b: U): [T, U]
Drugi parametr powiązany z kluczami pierwszego.function get<T, K extends keyof T>(o: T, k: K): T[K]
Klasa z parametrem typu na polach i metodach.class Box<T> { value: T }
Kształt obiektu z parametrem typu.interface Result<T> { data: T }
Parametr typu w funkcji strzałkowej; przecinek na końcu powstrzymuje pliki .tsx przed odczytaniem go jako JSX.const first = <T,>(xs: T[]): T => xs[0]
Ograniczenie
Wymaga, aby T było przypisywalne do Type.function len<T extends { length: number }>(x: T)
Ogranicza T do klucza innego typu.type Keys<O> = keyof O
Ogranicza T do klasy, którą można konstruować.function make<C extends new () => C>(c: C): C
Wymaga, aby T spełniało kilka ograniczeń naraz.function log<T extends Error & { code: number }>(e: T)
Ogranicza do czegokolwiek; utrzymuje parametr generyczny bez zawężania go.type Wrap<T> = T extends unknown ? { v: T } : never
Domyślny typ i infer
Nadaje T wartość domyślną, gdy wywołujący go pominie.function parse<T = string>(): T
Przechwytuje typ wewnątrz typu warunkowego.type El<T> = T extends Array<infer I> ? I : never
Rozpakowuje zagnieżdżony Promise do jego wewnętrznego typu.type Data = Awaited<Promise<User>>
Przechwytuje jeden fragment typu literału szablonowego.type Path<S> = S extends `/api/${infer R}` ? R : never
Sprawdza całą unię naraz; nagie T wnioskuje po jednym składniku na raz.type El<T> = [T] extends [Array<infer I>] ? I : never
Warunkowe i mapowane
Wybiera typ w zależności od tego, czy T jest przypisywalne do U.type IsStr<T> = T extends string ? true : false
Buduje nowy typ obiektu, przekształcając każdy klucz T.type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Obiekt, którego kluczami są K, a wartościami V.type Scores = Record<string, number>
Wbudowane generics wywodzące się z powyższych wzorców.type Preview = Pick<User, "id" | "name">
Nagie T przed extends wykonuje się raz na składnik unii i sumuje wyniki.ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Dodaje lub usuwa modyfikatory na mapowanych kluczach.type Req<T> = { [K in keyof T]-?: T[K] }
Klucze wartości z czasu wykonania, jako typ.const opts = { a: 1 }; type K = keyof typeof opts
Buduje typ stringowy z innych typów stringowych.type Route = `/users/${string}`
Łączy typy krotkowe końcem w koniec.type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Typ, którego definicja odwołuje się do siebie.type Json = string | number | Json[] | { [k: string]: Json }
Sprawdza wartość względem typu i zachowuje jej węższy typ literału.const c = { dark: "#000" } satisfies Record<string, string>
Zachowuje typ literału wywołującego zamiast go rozszerzać (TS 5.0).function first<const T>(xs: readonly T[]): T