Mga generic pattern na madalas mong ginagamit, pangkat ayon sa gawin: magdeklara ng type parameter, i-constrain ito, bigyan ng default, mag-branch gamit ang conditional, mag-capture gamit ang infer, at i-map ang isang hugis. Pinapares ng bawat hilera ang pattern sa isang linyang halimbawa.
Ang generic ay isang type parameter: placeholder para sa tipong pinipili ng caller, kaya gumagana ang isang function o tipo para sa maraming hugis nang hindi nawawala ang precision. Basahin ang <T> bilang para sa isang tipo T. Nanggagaling ang lakas nito sa pag-constrain sa T, pag-branch dito, at pag-map dito. Ang mga pattern sa ibaba ang gumaganang bokabularyo.
Talaan ng sanggunian · 28 mga entry
TypeScript GenericsExplained
28 of 28 rows
Pagdeklara
Type parameter na pinipili ng caller.
function first<T>(xs: T[]): T
Ilang magkakahiwalay na type parameter.
function pair<T, U>(a: T, b: U): [T, U]
Pangalawang parameter na nakatali sa mga key ng una.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Class na may type parameter sa mga field at method nito.
class Box<T> { value: T }
Hugis ng object na may type parameter.
interface Result<T> { data: T }
Type parameter sa arrow function; pinipigil ng trailing comma ang .tsx files na basahin ito bilang JSX.
const first = <T,>(xs: T[]): T => xs[0]
Pag-constrain
Kinakailangang assignable ang T sa Type.
function len<T extends { length: number }>(x: T)
Ina-limit ang T sa isang key ng ibang tipo.
type Keys<O> = keyof O
Ina-limit ang T sa class na kayang i-construct.
function make<C extends new () => C>(c: C): C
Kinakailangang tumugma ang T sa ilang constraint nang sabay-sabay.
function log<T extends Error & { code: number }>(e: T)
Limitado sa anumang tipo; panatilihing generic ang parameter nang walang narrowing.
type Wrap<T> = T extends unknown ? { v: T } : never
Default at infer
Nagbibigay ng default sa T kapag iniwan ito ng caller.
function parse<T = string>(): T
Kumukuha ng tipo sa loob ng conditional.
type El<T> = T extends Array<infer I> ? I : never
Bumubukas ng nested Promise pabalik sa inner nitong tipo.
type Data = Awaited<Promise<User>>
Kumukuha ng isang piraso ng template literal na tipo.
type Path<S> = S extends `/api/${infer R}` ? R : never
Sinusuri ang buong union nang isang beses; isang member kada beses ang ini-infer ng naked T.
type El<T> = [T] extends [Array<infer I>] ? I : never
Conditional at mapped
Pumipili ng tipo batay sa kung assignable ba ang T sa U.
type IsStr<T> = T extends string ? true : false
Gumagawa ng bagong tipo ng object sa pamamagitan ng pag-transform sa bawat key ng T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Object na ang mga key ay K at ang mga value ay V.
type Scores = Record<string, number>
Mga built-in na generic na nagmula sa mga pattern sa itaas.
type Preview = Pick<User, "id" | "name">
Ang bare T bago ang extends ay tumatakbo nang isang beses kada member ng union at pinagsasama-sama ang mga resulta.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Nagdadagdag o nag-aalis ng mga modifier sa mga naka-map na key.
type Req<T> = { [K in keyof T]-?: T[K] }
Mga key ng runtime value, bilang tipo.
const opts = { a: 1 }; type K = keyof typeof opts
Gumagawa ng string na tipo mula sa ibang string na tipo.
type Route = `/users/${string}`
Nagdudugtong ng mga tuple na tipo.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Tipo na ang definition ay tumutukoy sa sarili nito.
type Json = string | number | Json[] | { [k: string]: Json }
Sinusuri ang value laban sa isang tipo at pinapanatili ang mas makitid nitong literal na tipo.
const c = { dark: "#000" } satisfies Record<string, string>
Pinapanatili ang literal na tipo ng caller sa halip na palawakin ito (TS 5.0).