الگوهای جنریکی که به آنها نیاز پیدا میکنید، گروهبندیشده بر اساس کار: اعلام یک پارامتر تایپ، محدودکردن آن، مقدار پیشفرض دادن، انشعاب با تایپ شرطی، گرفتن با infer و نقشهبرداری روی یک شکل. هر ردیف الگو را با یک مثال یکخطی جفت میکند.
جنریک یک پارامتر تایپ است: جاینگهدار برای تایپی که فراخوان انتخاب میکند، تا یک تابع یا تایپ برای شکلهای زیاد کار کند بیآنکه دقت از دست برود. <T> را بخوانید «برای تایپی مانند T». قدرت آن از محدودکردن T، انشعاب روی آن و نقشهبرداری روی آن میآید. الگوهای زیر واژگان کاری شما هستند.
جدول مرجع · 28 مورد
جنریکهای TypeScriptExplained
28 of 28 rows
اعلام
یک پارامتر تایپ که فراخوان انتخاب میکند.
function first<T>(xs: T[]): T
چند پارامتر تایپ مستقل.
function pair<T, U>(a: T, b: U): [T, U]
پارامتر دومی که به کلیدهای اول گره خورده است.
function get<T, K extends keyof T>(o: T, k: K): T[K]
کلاسی با پارامتر تایپ روی فیلدها و متدهایش.
class Box<T> { value: T }
شکل شیء با یک پارامتر تایپ.
interface Result<T> { data: T }
پارامتر تایپ روی تابع فلش؛ ویرگول انتهایی مانع میشود فایلهای .tsx آن را JSX بخوانند.
const first = <T,>(xs: T[]): T => xs[0]
محدودسازی
الزام میکند T به Type قابل انتساب باشد.
function len<T extends { length: number }>(x: T)
T را به یک کلید از تایپی دیگر محدود میکند.
type Keys<O> = keyof O
T را به کلاسی محدود میکند که بتوان با new ساخت.
function make<C extends new () => C>(c: C): C
الزام میکند T چند محدودیت را همزمان برآورده کند.
function log<T extends Error & { code: number }>(e: T)
محدود به هر چیزی؛ پارامتر را بدون تنگکردن، جنریک نگه میدارد.
type Wrap<T> = T extends unknown ? { v: T } : never
پیشفرض و infer
وقتی فراخوان آن را ننویسد، به T مقدار پیشفرض میدهد.
function parse<T = string>(): T
گرفتن یک تایپ درون یک تایپ شرطی.
type El<T> = T extends Array<infer I> ? I : never
یک Promise تودرتو را تا تایپ درونیاش باز میکند.
type Data = Awaited<Promise<User>>
یک تکه از تایپ قالب رشتهای را میگیرد.
type Path<S> = S extends `/api/${infer R}` ? R : never
کل یونیون را یکجا بررسی میکند؛ T لخت هر بار یک عضو را infer میکند.
type El<T> = [T] extends [Array<infer I>] ? I : never
شرطی و نگاشتی
بر اساس قابلانتساببودن T به U یک تایپ را برمیگزیند.
type IsStr<T> = T extends string ? true : false
با تبدیل هر کلید T یک تایپ شیء تازه میسازد.
type Frozen<T> = { [K in keyof T]: Readonly<T[K]> }
شیئی که کلیدهایش K و مقدارهایش V است.
type Scores = Record<string, number>
جنریکهای داخلی که از الگوهای بالا مشتق شدهاند.
type Preview = Pick<User, "id" | "name">
T لخت پیش از extends یکبار برای هر عضو یونیون اجرا میشود و نتیجهها را یونیون میکند.
ToArray<'a' | 'b'> = 'a'[] | 'b'[]
روی کلیدهای نگاشتهشده اصلاحگرها را میافزاید یا حذف میکند.
type Req<T> = { [K in keyof T]-?: T[K] }
کلیدهای یک مقدار زمان اجرا، بهصورت تایپ.
const opts = { a: 1 }; type K = keyof typeof opts
از تایپهای رشتهای دیگر، تایپ رشتهای میسازد.
type Route = `/users/${string}`
تایپهای تاپل را پشت به پشت به هم میچسباند.
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
تایپی که تعریفش به خودش ارجاع میدهد.
type Json = string | number | Json[] | { [k: string]: Json }
یک مقدار را با یک تایپ بررسی میکند و تایپ لفظی محدودترش را نگه میدارد.
const c = { dark: "#000" } satisfies Record<string, string>
بهجای گسترش، تایپ لفظی فراخوان را نگه میدارد (TS 5.0).