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

סוג כינויים לעומת ממשקים

ב-TypeScript, נוכל להגדיר את המבנה של אובייקטים מורכבים בשתי דרכים עיקריות: באמצעות ממשקים (interface) או כינויים מסוג סוג (type). שניהם משמשים לתיאור ה"צורה" של אובייקט או מבנה נתונים, אך יש להם כמה הבדלים מהותיים.


ממשקים (interface)

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

TS
interface Book {
  title: string;
  pages: number;
  author?: string; // Optional property (can be omitted)
}

const myBook: Book = {
  title: 'The Lord of the Rings',
  pages: 1200,
};

סימן השאלה (?) מסמן מאפיין כאופציונלי. האובייקט myBook חוקי גם אם הוא משמיט את המאפיין author.


סוג כינויים (type)

כינוי טיפוס מאפשר לך לשייך שם חדש לכל טיפוס קיים, כולל טיפוסים פרימיטיביים, איגודים, tuples או מבני אובייקט שלמים.

TS
type Point = {
  x: number;
  y: number;
};

const coordinates: Point = { x: 10, y: 20 };

הבדלים מרכזיים: הרחבה ומיזוג הצהרות

למרות ש-interface ו-type ניתנים להחלפה עבור רוב מקרי השימוש הרגילים, הם מציגים שני הבדלים קריטיים:

1. הרחבה (ירושה)

ממשקים מורחבים באמצעות מילת המפתח extends:

TS
interface User {
  username: string;
}

interface Admin extends User {
  privileges: string[];
}

לא ניתן להרחיב כינויים של סוגים באמצעות extends, אך ניתן לשלב אותם באמצעות האופרטור צומת (&):

TS
type User = {
  username: string;
};

type Admin = User & {
  privileges: string[];
};

2. מיזוג הכרזה

ממשקים מרובים עם אותו שם באותו היקף מתמזגים אוטומטית על ידי המהדר:

TS
interface User {
  name: string;
}
interface User {
  email: string;
}
// Now User has both 'name' and 'email'!

התנהגות זו לא נתמכת על ידי כינויים מסוגים: הכרזה על אותו type פעמיים תפעיל שגיאה בזמן הידור.


נסה זאת בעצמך

תרגיל 1: ממשק משתמש

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

הגדר ממשק בשם User שמתאר אובייקט משתמש. הממשק חייב להכיל: id כמספר, שם משתמש כמחרוזת, ואימייל כמחרוזת אופציונלית.

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

השתמש במחרוזת האימייל התחביר?: כדי לסמן אותה כאופציונלית.

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

תרגיל 2: כינוי מסוג Point2D

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

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

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

השתמש בסוג התחביר Point2D = { x: number; y: מספר; };

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

תרגיל 3: הרחבת ממשקים

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

הגדר ממשק בשם Product עם id (מספר) ומחיר (מספר). לאחר מכן, הגדר ממשק בשם DiscountedProduct שמרחיב את המוצר ומוסיף מאפיין אופציונלי בשם discountCode (מחרוזת).

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

השתמש בהרחבת המוצר כדי לרשת את השדות, והוסף discountCode?: מחרוזת.

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

תרגיל 4: תצורת שרת

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

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

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

השתמש בסוג התחביר ServerConfig = { host: string; יציאה: מספר; useHttps?: boolean; }.

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