Geneeriset mallit, joihin tartut, ryhmiteltynä tehtävän mukaan: esittele tyyppiparametri, rajoita sitä, anna oletus, haaraudu ehdollisella tyypillä, sieppaa inferillä ja muunna muotoa. Jokainen rivi parittaa mallin yksiriviseen esimerkkiin.
Geneerinen tyyppi on tyyppiparametri: paikkamerkki tyypille, jonka kutsuja valitsee, joten yksi funktio tai tyyppi toimii monille muodoille menettämättä tarkkuutta. Lue <T> merkityksessä ”jollekin tyypille T”. Voima syntyy T:n rajoittamisesta, siihen haarautumisesta ja sen yli muuntamisesta. Alla olevat mallit ovat työsanasto.
Referenssitaulukko · 28 merkintää
TypeScriptin geneeriset tyypitExplained
28 of 28 rows
Esittele
Tyyppiparametri, jonka kutsuja valitsee.
function first<T>(xs: T[]): T
Useita toisistaan riippumattomia tyyppiparametreja.
function pair<T, U>(a: T, b: U): [T, U]
Toinen parametri, joka on sidottu ensimmäisen avaimiin.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Luokka, jolla on tyyppiparametri kentissään ja metodeissaan.
class Box<T> { value: T }
Oliomuoto, jolla on tyyppiparametri.
interface Result<T> { data: T }
Tyyppiparametri nuolifunktiossa; perässä oleva pilkku estää .tsx-tiedostoja tulkitsemasta sitä JSX:ksi.
const first = <T,>(xs: T[]): T => xs[0]
Rajoita
Vaatii, että T on sijoitettavissa tyyppiin Type.
function len<T extends { length: number }>(x: T)
Rajoittaa T:n jonkin toisen tyypin avaimeksi.
type Keys<O> = keyof O
Rajoittaa T:n konstruktoitavaan luokkaan.
function make<C extends new () => C>(c: C): C
Vaatii, että T täyttää useita rajoitteita yhtä aikaa.
function log<T extends Error & { code: number }>(e: T)
Rajoittaa mihin tahansa; pitää parametrin geneerisenä kaventamatta sitä.
type Wrap<T> = T extends unknown ? { v: T } : never
Oletus ja infer
Antaa T:lle oletusarvon, kun kutsuja jättää sen pois.
function parse<T = string>(): T
Sieppaa tyypin ehdollisen tyypin sisäpuolelta.
type El<T> = T extends Array<infer I> ? I : never
Purkaa sisäkkäisen Promisen sisimpään tyyppiinsä.
type Data = Awaited<Promise<User>>
Sieppaa yhden osan template literal -tyypistä.
type Path<S> = S extends `/api/${infer R}` ? R : never
Tarkistaa koko unionin kerralla; paljas T päättelee yhden jäsenen kerrallaan.
type El<T> = [T] extends [Array<infer I>] ? I : never
Ehdolliset ja mapped-tyypit
Valitsee tyypin sen mukaan, onko T sijoitettavissa tyyppiin U.
type IsStr<T> = T extends string ? true : false
Rakentaa uuden oliotyypin muuntamalla T:n jokaisen avaimen.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Olio, jonka avaimet ovat K ja arvot V.
type Scores = Record<string, number>
Sisäänrakennetut geneeriset tyypit, jotka on johdettu yllä olevista malleista.
type Preview = Pick<User, "id" | "name">
Paljas T ennen extends-avainsanaa suoritetaan kerran per unionin jäsen ja tulokset yhdistetään unioniksi.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Lisää tai poistaa määritteitä muunnettujen avaimien kohdalta.
type Req<T> = { [K in keyof T]-?: T[K] }
Ajonaikaisen arvon avaimet tyyppinä.
const opts = { a: 1 }; type K = keyof typeof opts
Rakentaa merkkijonotyypin muista merkkijonotyypeistä.
type Route = `/users/${string}`
Liittää tupletyypit päästä päähän.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Tyyppi, jonka määritelmä viittaa itseensä.
type Json = string | number | Json[] | { [k: string]: Json }
Tarkistaa arvon tyyppiä vasten ja säilyttää sen kapeamman literaalityypin.
const c = { dark: "#000" } satisfies Record<string, string>
Säilyttää kutsujan literaalityypin sen laajentamisen sijaan (TS 5.0).