הסבר כללי על TypeScript מתקדם עם דוגמאות
כללי ב-TypeScript מספקים דרך ליצור רכיבי קוד ניתנים לשימוש חוזר וגמישים על ידי עבודה עם מגוון סוגי נתונים. גנריות מתקדמות לוקחות את הרעיון הזה קדימה על ידי הצגת תכונות נוספות כמו אילוצים, ערכי ברירת מחדל וסוגים מרובים, המאפשרים למפתחים לכתוב קוד חזק יותר ובטוח יותר. במאמר זה ישמשו דוגמאות כדי לחקור את המושגים המתקדמים הללו בגנריות.
אילוצים כלליים
אילוצים מגבילים את הסוגים שגנרי יכול לקבל. זה מבטיח שהסוג המועבר לפונקציה או מחלקה גנרית עומד בקריטריונים מסוימים. לדוגמה, ניתן להשתמש באילוץ כדי להבטיח שלסוג הגנרי יש מאפיין או שיטה ספציפיים.
function getLength<T extends { length: number }>(arg: T): number {
return arg.length;
}
const stringLength = getLength("TypeScript");
const arrayLength = getLength([1, 2, 3]);
בדוגמה זו, האילוץ <T extends { length: number }>
מבטיח שלארגומנט המועבר ל-getLength
יש מאפיין length
.
גנריות מרובות
TypeScript מאפשר שימוש במספר סוגים גנריים באותה פונקציה, מחלקה או ממשק. זה שימושי כאשר עובדים עם זוגות ערכים או מבני נתונים אחרים הכוללים מספר סוגים.
function pair<T, U>(first: T, second: U): [T, U] {
return [first, second];
}
const stringNumberPair = pair("TypeScript", 2024);
פונקציה זו, pair
, מקבלת שני סוגים גנריים שונים, T
ו-U
, ומחזירה טופלה המכילה את שני הסוגים.
סוגי ברירת מחדל גנריים
לגנריות ב-TypeScript יכולות להיות גם סוגי ברירת מחדל. זה מועיל כאשר אתה רוצה לגנרי שיהיה סוג נפילה אם לא מסופק סוג ספציפי.
function identity<T = string>(value: T): T {
return value;
}
const defaultString = identity("Hello"); // T is string
const customNumber = identity<number>(100); // T is number
בדוגמה זו, אם שום סוג לא מועבר ל-זהות
, ברירת המחדל היא מחרוזת
.
שימוש גנרי עם ממשקים
ניתן להשתמש בגנריות עם ממשקים כדי להגדיר מבנים מורכבים שבהם הסוגים אינם קבועים. זה מוסיף גמישות לאופן ניהול הנתונים.
interface Container<T> {
value: T;
}
const stringContainer: Container<string> = { value: "Hello" };
const numberContainer: Container<number> = { value: 42 };
ממשק Container
נועד להחזיק ערך מכל סוג, המאפשר סוגים שונים של מכולות עם סוגים ספציפיים.
שיעורים כלליים
מחלקות ב-TypeScript יכולות להיות גם כלליות. זה שימושי במיוחד בעת תכנון מחלקות שעובדות עם סוגי נתונים שונים, כגון אחסון נתונים או מחלקות איסוף.
class DataStore<T> {
private data: T[] = [];
add(item: T): void {
this.data.push(item);
}
getAll(): T[] {
return this.data;
}
}
const stringStore = new DataStore<string>();
stringStore.add("Hello");
stringStore.add("TypeScript");
const numberStore = new DataStore<number>();
numberStore.add(42);
בדוגמה זו, המחלקה DataStore
עובדת עם כל סוג של נתונים, ומספקת דרך בטוחה לאחסון ואחזור של אלמנטים.
מַסְקָנָה
גנריות מתקדמות ב-TypeScript הן כלי רב עוצמה לכתיבת קוד גמיש, לשימוש חוזר ובטוח להקלדה. באמצעות אילוצים, סוגים מרובים, ערכי ברירת מחדל וגנריות במחלקות וממשקים, מפתחים יכולים לכתוב קוד מורכב וחזק יותר. הבנה ושימוש במושגים מתקדמים אלו מאפשרים גמישות רבה יותר ומבטיחים בטיחות סוגים בכל יישומים.