דילוג לתוכן המרכזי
מודול 3 · שיעור 2 מתוך 26/14 בקורס~15 min
שיעורי מודול (2/2)

גנריות בסיסיות

גנריות (תכנות גנרי) הן אחת התכונות החזקות ביותר של TypeScript. הם מאפשרים לך לכתוב רכיבים, פונקציות וממשקים גמישים לשימוש חוזר שיכולים לעבוד עם סוגי נתונים שונים תוך שמירה על בטיחות סוג מקסימלית והימנעות משימוש ב-any.


פונקציות כלליות

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

TS
function identity<T>(arg: T): T {
  return arg;
}

האות T (קיצור של Type) היא מציין מיקום לסוג. כאשר אנו קוראים identity, TypeScript לוכד את סוג הארגומנט שעבר ומגדיר אוטומטית את T לסוג זה:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

ממשקים גנריים וכינויים

ניתן להחיל גנריות גם על ממשקים וכינויי סוג כדי להגדיר מיכלים או מבני נתונים כלליים:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

מספר פרמטרים מסוג

אנו יכולים להגדיר פונקציות או טיפוסים המשתמשים במספר משתני סוג (לדוגמה, T וU):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

אילוצים כלליים

לפעמים אנחנו רוצים להגביל את הסוגים המקובלים על ידי גנרי. אנו יכולים להשתמש במילת המפתח extends כדי להוסיף אילוץ.

לדוגמה, אם נרצה שהסוג הגנרי תמיד יהיה בעל מאפיין length (כמו מחרוזות או מערכים):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

נסה זאת בעצמך

תרגיל 1: פונקציית זהות גנרית

פעילות גופנית#ts.m3.l2.e1
ניסיונות: 0טוען...

השלם את פונקציית הזהות הגנרית כך שהיא תקבל פרמטר ערך מסוג T ותחזיר אותו ללא שינוי.

טוען עורך...
הצג רמז

סוג ההחזר חייב להיות אותו סוג גנרי T כמו הפרמטר.

הפתרון זמין לאחר 3 ניסיונות

תרגיל 2: עטיפת קופסה גנרית

פעילות גופנית#ts.m3.l2.e2
ניסיונות: 0טוען...

הגדר ממשק גנרי בשם Box שמקבל פרמטר מסוג T ויש לו מאפיין יחיד בשם תוכן מסוג T.

טוען עורך...
הצג רמז

השתמש בממשק תיבת<T> { תוכן: T; } תחביר.

הפתרון זמין לאחר 3 ניסיונות

תרגיל 3: אילוץ גנרי

פעילות גופנית#ts.m3.l2.e3
ניסיונות: 0טוען...

כתוב פונקציה גנרית בשם getLength שמקבלת פרמטר arg. arg חייב להיות מוגבל לממשק שיש לו מאפיין length (number). הפונקציה חייבת להחזיר arg.length.

טוען עורך...
הצג רמז

הכריז על הפונקציה כ-getLength<T extends HasLength>(arg: T): מספר והחזר arg.length.

הפתרון זמין לאחר 3 ניסיונות

תרגיל 4: זוג גנרי

פעילות גופנית#ts.m3.l2.e4
ניסיונות: 0טוען...

הגדירו ממשק גנרי Pair<T, U> עם שני מאפיינים: ראשון מסוג T והשני מסוג U. לאחר מכן, צור פונקציה גנרית makePair שמקבלת ראשון (מטיפוס T) ושני (מטיפוס U) ומחזירה אובייקט המיישם Pair<T, U>.

טוען עורך...
הצג רמז

השתמש בתחביר עבור שני פרמטרים גנריים Pair<T, U> והגדר את makePair בהתאם.

הפתרון זמין לאחר 3 ניסיונות