أنماط الـ generics التي تحتاجها باستمرار، مجمعة حسب الوظيفة: التصريح عن معامل نوع، وتقييده، وإعطاؤه قيمة افتراضية، والتفريع بنوع شرطي، والالتقاط بـ infer، والمرور على شكل ما. كل صف يقرن النمط بمثال من سطر واحد.
الـ generic هو معامل نوع: عنصر نائب لنوع يختاره المُستدعي، بحيث تعمل دالة واحدة أو نوع واحد مع أشكال كثيرة دون فقدان الدقة. اقرأ <T> بمعنى «لنوعٍ ما T». القوة تأتي من تقييد T والتفريع عليه والمرور فوقه. الأنماط أدناه هي المفردات العملية.
جدول مرجعي · 28 إدخالات
Generics في 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) له معامل نوع في حقوله وطرقه.
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>>
يلتقط جزءًا من نوع قالب نصي (template literal).
type Path<S> = S extends `/api/${infer R}` ? R : never
يفحص الاتحاد كله دفعة واحدة؛ الـ T المجرد يستنتج عضوًا واحدًا في كل مرة.
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}`
يصل أنواع الصفوف (tuples) من الطرف إلى الطرف.
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).