Skip to content

Generika v TypeScriptu vysvětleny

Způsoby používání generik, ke kterým se vracíte, seskupené podle úkolu: deklarovat parametr typu, omezit ho, dát mu výchozí hodnotu, rozvětvit podmíněným typem, zachytit pomocí infer a mapovat přes tvar. Každý řádek spojuje vzor s jednořádkovým příkladem.

Generic je parametr typu: zástupný symbol pro typ, který si vybere volající, takže jedna funkce nebo typ obslouží mnoho tvarů bez ztráty přesnosti. Čtěte <T> jako „pro nějaký typ T“. Síla pramení z omezování T, větvení podle něj a mapování přes něj. Vzory níže jsou pracovní slovní zásoba.

Referenční tabulka · 28 položek
28 of 28 rows
Deklarace
Parametr typu, který si vybere volající.function first<T>(xs: T[]): T
Několik nezávislých parametrů typu.function pair<T, U>(a: T, b: U): [T, U]
Druhý parametr svázaný s klíči prvního.function get<T, K extends keyof T>(o: T, k: K): T[K]
Třída s parametrem typu ve svých polích a metodách.class Box<T> { value: T }
Tvar objektu s parametrem typu.interface Result<T> { data: T }
Parametr typu u arrow funkce; koncová čárka brání souborům .tsx, aby ho četly jako JSX.const first = <T,>(xs: T[]): T => xs[0]
Omezení
Vyžaduje, aby T bylo přiřaditelné k Type.function len<T extends { length: number }>(x: T)
Omezuje T na klíč jiného typu.type Keys<O> = keyof O
Omezuje T na třídu konstruovatelnou přes new.function make<C extends new () => C>(c: C): C
Vyžaduje, aby T splňovalo několik omezení najednou.function log<T extends Error & { code: number }>(e: T)
Omezuje na cokoli; ponechává parametr generický bez zúžení.type Wrap<T> = T extends unknown ? { v: T } : never
Výchozí hodnota & infer
Dá T výchozí hodnotu, když ji volající vynechá.function parse<T = string>(): T
Zachytí typ uvnitř podmíněného typu.type El<T> = T extends Array<infer I> ? I : never
Rozbalí vnořený Promise na jeho vnitřní typ.type Data = Awaited<Promise<User>>
Zachytí část typu template literálu.type Path<S> = S extends `/api/${infer R}` ? R : never
Zkontroluje celou unii najednou; holé T inferuje jednoho člena po druhém.type El<T> = [T] extends [Array<infer I>] ? I : never
Podmíněné a mapované typy
Vybere typ podle toho, zda je T přiřaditelné k U.type IsStr<T> = T extends string ? true : false
Postaví nový typ objektu transformací každého klíče T.type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Objekt, jehož klíče jsou K a hodnoty V.type Scores = Record<string, number>
Vestavěná generika odvozená z výše uvedených vzorů.type Preview = Pick<User, "id" | "name">
Holé T před extends běží jednou pro každého člena unie a výsledky spojuje do unie.ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Přidává nebo odebíra modifikátory u mapovaných klíčů.type Req<T> = { [K in keyof T]-?: T[K] }
Klíče hodnoty známé za běhu, jako typ.const opts = { a: 1 }; type K = keyof typeof opts
Postaví řetězcový typ z jiných řetězcových typů.type Route = `/users/${string}`
Spojí n-ticové typy od konce ke konci.type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Typ, jehož definice odkazuje sama na sebe.type Json = string | number | Json[] | { [k: string]: Json }
Zkontroluje hodnotu proti typu a zachová její užší literálový typ.const c = { dark: "#000" } satisfies Record<string, string>
Zachová literálový typ volajícího místo jeho rozšíření (TS 5.0).function first<const T>(xs: readonly T[]): T