תבניות הג’נריק שמשתמשים בהן, מקובצות לפי תפקיד: הצהרה על פרמטר טיפוס, הגבלתו, קביעת ברירת מחדל, הסתעפות עם טיפוס מותנה, לכידה עם 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 למחלקה שאפשר ליצור מופע שלה.
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 חשוף מסיק חבר אחד בכל פעם.
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'[]
מוסיף או מסיר משתנים (modifiers) על מפתחות ממופים.
type Req<T> = { [K in keyof T]-?: T[K] }
המפתחות של ערך בזמן ריצה, בתור טיפוס.
const opts = { a: 1 }; type K = keyof typeof opts
בונה טיפוס מחרוזת מטיפוסי מחרוזת אחרים.
type Route = `/users/${string}`
מחבר טיפוסי tuple מקצה לקצה.
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).