לדלג לתוכן

5.3 אינטרפייסים וטייפים תרגול

תרגול - אינטרפייסים וטייפים

תרגיל 1 - אינטרפייסים בסיסיים

א. הגדירו אינטרפייס Book עם השדות: title (מחרוזת), author (מחרוזת), pages (מספר), isbn (מחרוזת), ו-publishedYear (מספר). צרו שני אובייקטים מהטיפוס הזה.

ב. כתבו פונקציה formatBook שמקבלת Book ומחזירה מחרוזת בפורמט: "Title by Author (Year) - Pages pages".

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

תרגיל 2 - שדות אופציונליים ו-readonly

א. הגדירו אינטרפייס UserProfile עם השדות:
- id - מספר, readonly
- username - מחרוזת, readonly
- email - מחרוזת
- bio - מחרוזת, אופציונלי
- website - מחרוזת, אופציונלי
- createdAt - מחרוזת, readonly

ב. צרו אובייקט מהטיפוס הזה. נסו לשנות את ה-id ואת ה-email - מה ההבדל?

ג. כתבו פונקציה updateProfile שמקבלת UserProfile ואובייקט עדכון עם email, bio, ו-website (כולם אופציונליים), ומחזירה UserProfile חדש עם השינויים. רמז: השתמשו ב-spread operator.

תרגיל 3 - interface לעומת type

עבור כל אחד מהמקרים הבאים, החליטו אם עדיף להשתמש ב-interface או ב-type, והגדירו את הטיפוס:

א. טיפוס שמייצג נקודה בדו-ממד (x, y) - שני מספרים

ב. טיפוס HttpMethod שיכול להיות אחד מהערכים: "GET", "POST", "PUT", "DELETE"

ג. טיפוס ApiError עם שדות code (מספר), message (מחרוזת), ו-details (מחרוזת אופציונלי)

ד. טיפוס Result שיכול להיות { success: true, data: string } או { success: false, error: string }

ה. טיפוס EventHandler שהוא פונקציה שמקבלת event: string ו-data: unknown ולא מחזירה כלום

תרגיל 4 - חתימת אינדקס

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

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

ג. הגדירו אינטרפייס TypedDictionary עם index signature וגם שדה חובה version: number. צרו אובייקט תקין מהטיפוס הזה.

תרגיל 5 - הרחבה וחיתוך

א. הגדירו אינטרפייס Shape עם שדה color: string. הרחיבו אותו ליצירת:
- Circle עם radius: number
- Rectangle עם width: number ו-height: number
- Triangle עם base: number ו-height: number

כתבו פונקציה getArea שמקבלת Circle, Rectangle, או Triangle (union) ומחזירה את השטח. רמז: השתמשו ב-"type" discriminator - הוסיפו שדה type לכל צורה.

ב. השתמשו ב-intersection (&) כדי ליצור טיפוס TimestampedUser שמשלב טיפוס User (עם name ו-email) עם טיפוס Timestamps (עם createdAt ו-updatedAt, שניהם מחרוזות).

ג. מה קורה כשיש קונפליקט בין שני טיפוסים ב-intersection? נסו ליצור intersection בין { x: number } לבין { x: string }. מה הטיפוס של x?

תרגיל 6 - טיפוסים מקוננים

הגדירו את מבנה הטיפוסים הבא שמתאר חנות מקוונת:

  • Product - שם, מחיר, קטגוריה (מחרוזת), ו-stock (מספר)
  • CartItem - מוצר (Product) וכמות (quantity)
  • Customer - שם, אימייל, וכתובת (Address עם street, city, zipCode)
  • Order - מזהה (readonly), לקוח (Customer), פריטים (CartItem[]), סטטוס ("pending" | "shipped" | "delivered"), ותאריך יצירה (readonly)

כתבו פונקציה calculateOrderTotal שמקבלת Order ומחזירה את הסכום הכולל.

כתבו פונקציה getOrderSummary שמקבלת Order ומחזירה מחרוזת עם סיכום ההזמנה: שם הלקוח, מספר הפריטים, והסכום הכולל.

תרגיל 7 - פונקציות באינטרפייס

א. הגדירו אינטרפייס Logger עם המתודות:
- info(message: string): void
- warn(message: string): void
- error(message: string, error?: Error): void

צרו אובייקט שמממש את האינטרפייס הזה (כל מתודה תדפיס ל-console עם prefix מתאים).

ב. הגדירו type בשם Validator שהוא פונקציה שמקבלת value: string ומחזירה { valid: boolean; message?: string }.

צרו שלושה validators:
- isNotEmpty - בודק שהמחרוזת לא ריקה
- isEmail - בודק שהמחרוזת מכילה @
- isMinLength(min: number) - מחזיר validator שבודק אורך מינימלי (פונקציה שמחזירה פונקציה)

כתבו פונקציה validate שמקבלת ערך (string) ומערך של validators, ומחזירה את כל ההודעות של הvalidators שנכשלו.