סוגים מתקדמים של TypeScript מוסברים עם דוגמאות

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

סוגי איגוד

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

// Union type example

function formatValue(value: string | number): string {
  if (typeof value === 'string') {
    return `String: ${value}`;
  } else {
    return `Number: ${value.toFixed(2)}`;
  }
}

console.log(formatValue("Hello"));
console.log(formatValue(123.456));

בדוגמה זו, הפונקציה 'formatValue' מקבלת מחרוזת או מספר ומעצבת את הערך בהתאם.

סוגי צומתים

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

// Intersection type example

interface Person {
  name: string;
  age: number;
}

interface Contact {
  email: string;
  phone: string;
}

type Employee = Person & Contact;

const employee: Employee = {
  name: "John Doe",
  age: 30,
  email: "john.doe@example.com",
  phone: "123-456-7890"
};

console.log(employee);

כאן, הסוג 'עובד' הוא צומת של 'אדם' ו'איש קשר', כלומר הוא מכיל מאפיינים משני הממשקים.

טיפוסים מילוליים

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

// Literal type example

type Direction = "up" | "down" | "left" | "right";

function move(direction: Direction): void {
  console.log(`Moving ${direction}`);
}

move("up");    // Valid
move("down");  // Valid
// move("side"); // Error: Argument of type '"side"' is not assignable to parameter of type 'Direction'.

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

סוגי טופל

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

// Tuple type example

let user: [string, number] = ["Alice", 30];

console.log(user[0]); // "Alice"
console.log(user[1]); // 30

// user = [30, "Alice"]; // Error: Type 'number' is not assignable to type 'string'.

ה-'user' tuple מוגדר עם מחרוזת ואחריה מספר, ויש לשמור על המבנה הזה.

סוגים מותנים

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

// Conditional type example

type IsString = T extends string ? "Yes" : "No";

type Test1 = IsString;  // "Yes"
type Test2 = IsString;  // "No"

בדוגמה זו, הסוג 'IsString' בודק אם הסוג 'T' הוא מחרוזת. היא מחזירה `"כן"` אם כן ו-`"לא"` אחרת.

סוגים ממופים

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

// Mapped type example

type ReadonlyPerson = {
  readonly [K in keyof Person]: Person[K];
};

const readonlyPerson: ReadonlyPerson = {
  name: "Alice",
  age: 30
};

// readonlyPerson.age = 31; // Error: Cannot assign to 'age' because it is a read-only property.

הסוג 'ReadonlyPerson' הופך את הסוג 'Person' על ידי הפיכת כל המאפיינים שלו לקריאה בלבד.

מַסְקָנָה

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