Skip to content

ג’נריקים של TypeScript מוסברים

תבניות הג’נריק שמשתמשים בהן, מקובצות לפי תפקיד: הצהרה על פרמטר טיפוס, הגבלתו, קביעת ברירת מחדל, הסתעפות עם טיפוס מותנה, לכידה עם infer ומיפוי על צורה. כל שורה משווה תבנית לדוגמה בת שורה אחת.

ג’נריק הוא פרמטר טיפוס: מציין מקום לטיפוס שהקורא בוחר, כך שפונקציה או טיפוס אחד משרתים צורות רבות בלי לאבד דיוק. קראו את <T> בתור: עבור טיפוס כלשהו T. הכוח מגיע מהגבלת T, מהסתעפות עליו וממיפוי עליו. התבניות שלהלן הן אוצר המילים העובד.

טבלת עזר · 28 ערכים
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).function first<const T>(xs: readonly T[]): T