סוגים מתקדמים של 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.