Pola generics yang kerap Anda gunakan, dikumpulkan mengikut tugas: mengisytiharkan parameter jenis, menyekatnya, memberi nilai lalai, bercabang dengan conditional, menangkap dengan infer, dan memetakan satu bentuk. Setiap baris memadankan pola dengan contoh satu baris.
Generic ialah parameter jenis: pemegang tempat bagi jenis yang dipilih oleh pemanggil, supaya satu fungsi atau jenis berfungsi untuk banyak bentuk tanpa kehilangan ketepatan. Baca <T> sebagai untuk sesuatu jenis T. Kekuatannya datang daripada menyekat T, bercabang ke atasnya, dan memetakannya. Pola di bawah ialah kosa kata kerjanya.
Jadual rujukan · 28 entri
Generik TypeScriptExplained
28 of 28 rows
Pengisytiharan
Parameter jenis yang dipilih oleh pemanggil.
function first<T>(xs: T[]): T
Beberapa parameter jenis yang bebas.
function pair<T, U>(a: T, b: U): [T, U]
Parameter kedua yang terikat pada kunci-kunci parameter pertama.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Class dengan parameter jenis pada medan dan kaedahnya.
class Box<T> { value: T }
Bentuk objek dengan parameter jenis.
interface Result<T> { data: T }
Parameter jenis pada arrow function; koma di hujung menghalang fail .tsx membacanya sebagai JSX.
const first = <T,>(xs: T[]): T => xs[0]
Sekatan
Mewajibkan T boleh diumpukkan kepada Type.
function len<T extends { length: number }>(x: T)
Mengehadkan T kepada satu kunci jenis lain.
type Keys<O> = keyof O
Mengehadkan T kepada class yang boleh dibina dengan new.
function make<C extends new () => C>(c: C): C
Mewajibkan T memenuhi beberapa sekatan serentak.
function log<T extends Error & { code: number }>(e: T)
Mengehadkan kepada apa sahaja; kekalkan parameter sebagai generik tanpa menyempitkannya.
type Wrap<T> = T extends unknown ? { v: T } : never
Default dan infer
Memberi T nilai lalai apabila pemanggil menghilangkannya.
function parse<T = string>(): T
Menangkap satu jenis di dalam conditional.
type El<T> = T extends Array<infer I> ? I : never
Membukakan Promise tersarang kepada jenis di dalamnya.
type Data = Awaited<Promise<User>>
Menangkap satu bahagian daripada template literal type.
type Path<S> = S extends `/api/${infer R}` ? R : never
Memeriksa keseluruhan union sekaligus; T telanjang membuat infer satu ahli pada satu masa.
type El<T> = [T] extends [Array<infer I>] ? I : never
Conditional dan mapped
Memilih jenis berdasarkan sama ada T boleh diumpukkan kepada U.
type IsStr<T> = T extends string ? true : false
Membina jenis objek baharu dengan mengubah setiap kunci T.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Objek yang kuncinya K dan nilainya V.
type Scores = Record<string, number>
Generics terbina dalam yang diterbitkan daripada pola di atas.
type Preview = Pick<User, "id" | "name">
T telanjang sebelum extends berjalan sekali bagi setiap ahli union dan menggabungkan hasilnya.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Menambah atau membuang pengubah suai pada kunci yang dipetakan.
type Req<T> = { [K in keyof T]-?: T[K] }
Kunci-kunci bagi nilai masa jalan, sebagai jenis.
const opts = { a: 1 }; type K = keyof typeof opts
Membina jenis rentetan daripada jenis rentetan lain.
type Route = `/users/${string}`
Menyambung jenis tuple dari hujung ke hujung.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Jenis yang definisinya merujuk dirinya sendiri.
type Json = string | number | Json[] | { [k: string]: Json }
Memeriksa nilai terhadap satu jenis dan mengekalkan jenis literalnya yang lebih sempit.
const c = { dark: "#000" } satisfies Record<string, string>
Mengekalkan jenis literal pemanggil selain meluaskannya (TS 5.0).