Modelele generics la care apelezi, grupate după sarcină: declară un parametru de tip, constrânge-l, dă-i o valoare implicită, ramifică printr-un tip condițional, capturează cu infer și mapează o formă. Fiecare rând asociază modelul cu un exemplu pe o linie.
Un generic este un parametru de tip: un înlocuitor pentru un tip ales de apelant, astfel încât o funcție sau un tip funcționează pentru multe forme fără a pierde precizie. Citește <T> ca «pentru un anumit tip T». Puterea vine din constrângerea lui T, ramificarea pe el și maparea peste el. Modelele de mai jos sunt vocabularul de lucru.
Tabel de referință · 28 intrări
Generics în TypeScriptExplained
28 of 28 rows
Declarare
Un parametru de tip ales de apelant.
function first<T>(xs: T[]): T
Mai mulți parametri de tip independenți.
function pair<T, U>(a: T, b: U): [T, U]
Un al doilea parametru legat de cheile primului.
function get<T, K extends keyof T>(o: T, k: K): T[K]
O clasă cu un parametru de tip pe câmpurile și metodele sale.
class Box<T> { value: T }
O formă de obiect cu un parametru de tip.
interface Result<T> { data: T }
Un parametru de tip pe o funcție săgeată; virgula finală împiedică fișierele .tsx să-l citească drept JSX.
const first = <T,>(xs: T[]): T => xs[0]
Constrângere
Cere ca T să fie atribuibil către Type.
function len<T extends { length: number }>(x: T)
Constrânge T la o cheie a altui tip.
type Keys<O> = keyof O
Constrânge T la o clasă instanciabilă.
function make<C extends new () => C>(c: C): C
Cere ca T să satisfacă mai multe constrângeri deodată.
function log<T extends Error & { code: number }>(e: T)
Constrânge la orice; păstrează parametrul generic fără a-l îngusta.
type Wrap<T> = T extends unknown ? { v: T } : never
Implicit și infer
Dă lui T o valoare implicită atunci când apelantul îl omite.
function parse<T = string>(): T
Capturează un tip în interiorul unui condițional.
type El<T> = T extends Array<infer I> ? I : never
Desfășoară un Promise imbricat către tipul său interior.
type Data = Awaited<Promise<User>>
Capturează o parte dintr-un tip literal-șablon.
type Path<S> = S extends `/api/${infer R}` ? R : never
Verifică toată uniunea deodată; un T gol deduce câte un membru pe rând.
type El<T> = [T] extends [Array<infer I>] ? I : never
Condiționale și mapate
Alege un tip în funcție de dacă T este atribuibil către U.
type IsStr<T> = T extends string ? true : false
Construiește un nou tip de obiect transformând fiecare cheie a lui T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Un obiect ale cărui chei sunt K și valorile V.
type Scores = Record<string, number>
Generics integrate, derivate din modelele de mai sus.
type Preview = Pick<User, "id" | "name">
Un T gol înainte de extends rulează o dată per membru al uniunii și unește rezultatele.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Adaugă sau elimină modificatori pe cheile mapate.
type Req<T> = { [K in keyof T]-?: T[K] }
Cheile unei valori de la executare, ca tip.
const opts = { a: 1 }; type K = keyof typeof opts
Construiește un tip string din alte tipuri string.
type Route = `/users/${string}`
Concatenează tipuri tuplă cap la cap.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Un tip a cărui definiție se referă la sine.
type Json = string | number | Json[] | { [k: string]: Json }
Verifică o valoare față de un tip și păstrează tipul literal mai îngust.
const c = { dark: "#000" } satisfies Record<string, string>
Păstrează tipul literal al apelantului în loc să-l lărgească (TS 5.0).