İhtiyaç duyduğunuz jenerik desenleri, işe göre gruplanmış: bir tip parametresi bildirin, kısıtlayın, varsayılan verin, koşulla dallanın, infer ile yakalayın ve bir şekil üzerinde eşleyin. Her satır, deseni tek satırlık bir örnekle eşleştirir.
Bir jenerik, bir tip parametresidir: çağıranın seçtiği tip için bir yer tutucu; böylece tek bir fonksiyon veya tip, kesinlik kaybetmeden birçok şekil için çalışır. <T> ifadesini "herhangi bir T tipi için" diye okuyun. Güç; T'yi kısıtlamaktan, ona göre dallanmaktan ve üzerinde eşleme yapmaktan gelir. Aşağıdaki desenler, günlük kullanımın kelime dağarcığıdır.
Referans tablosu · 28 kayıt
TypeScript JenerikleriExplained
28 of 28 rows
Bildirme
Çağıranın seçtiği bir tip parametresi.
function first<T>(xs: T[]): T
Birbirinden bağımsız birkaç tip parametresi.
function pair<T, U>(a: T, b: U): [T, U]
İlkinin anahtarlarına bağlanan ikinci bir parametre.
function get<T, K extends keyof T>(o: T, k: K): T[K]
Alanlarında ve metotlarında tip parametresi taşıyan bir sınıf.
class Box<T> { value: T }
Tip parametreli bir nesne şekli.
interface Result<T> { data: T }
Ok fonksiyonunda tip parametresi; sondaki virgül, .tsx dosyalarının bunu JSX sanmasını önler.
const first = <T,>(xs: T[]): T => xs[0]
Kısıtlama
T'nin Type'a atanabilir olmasını gerektirir.
function len<T extends { length: number }>(x: T)
T'yi başka bir tipin anahtarlarından birine kısıtlar.
type Keys<O> = keyof O
T'yi kurulabilir bir sınıfa kısıtlar.
function make<C extends new () => C>(c: C): C
T'nin aynı anda birkaç kısıtı karşılamasını gerektirir.
function log<T extends Error & { code: number }>(e: T)
Her şeye kısıtlar; parametreyi daraltmadan jenerik tutar.
type Wrap<T> = T extends unknown ? { v: T } : never
Varsayılan & infer
Çağıran belirtmezse T'ye bir varsayılan verir.
function parse<T = string>(): T
Bir koşulun içinde bir tipi yakalar.
type El<T> = T extends Array<infer I> ? I : never
İç içe bir Promise'ı iç tipine açar.
type Data = Awaited<Promise<User>>
Bir şablon literal tipinin bir parçasını yakalar.
type Path<S> = S extends `/api/${infer R}` ? R : never
Tüm birliği tek seferde denetler; çıplak bir T üyeleri tek tek çıkarır.
type El<T> = [T] extends [Array<infer I>] ? I : never
Koşullu & eşlemeli
T'nin U'ya atanabilir olup olmadığına göre bir tip seçer.
type IsStr<T> = T extends string ? true : false
T'nin her anahtarını dönüştürerek yeni bir nesne tipi kurar.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
Anahtarları K, değerleri V olan bir nesne.
type Scores = Record<string, number>
Yukarıdaki desenlerden türetilmiş yerleşik jenerikler.
type Preview = Pick<User, "id" | "name">
extends'ten önceki çıplak bir T, birliğin her üyesi için bir kez çalışır ve sonuçları birleştirir.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
Eşlenmiş anahtarlara değiştirici ekler veya çıkarır.
type Req<T> = { [K in keyof T]-?: T[K] }
Çalışma zamanı bir değerin anahtarları, tip olarak.
const opts = { a: 1 }; type K = keyof typeof opts
Diğer dize tiplerinden bir dize tipi kurar.
type Route = `/users/${string}`
Demet tiplerini uç uca ekler.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Tanımı kendine başvuran bir tip.
type Json = string | number | Json[] | { [k: string]: Json }
Bir değeri bir tiple denetler ve daha dar literal tipini korur.
const c = { dark: "#000" } satisfies Record<string, string>
Çağıranın literal tipini genişletmek yerine korur (TS 5.0).