۸

Generics

نوشتن توابع و کلاس‌های انعطاف‌پذیر که با انواع مختلف کار می‌کنند.

Generics: ساختن کدهای همه‌کاره

فرض کن یه تابع داری که اولین عضو یه آرایه رو برمی‌گردونه. اگه آرایه‌ت عددی باشه، خروجی عدده. اگه رشته‌ای باشه، خروجی رشته‌ست. به جای اینکه برای هر نوع داده یه تابع جدا بنویسی، می‌تونی یه تابع جنریک (Generic) بنویسی. ما از یه متغیر برای تایپ استفاده می‌کنیم (معمولاً `T`) که نماینده هر نوعی می‌تونه باشه.

// این تابع یه آرایه از هر نوعی (T) می‌گیره و یه عضو از همون نوع برمی‌گردونه
function getFirstElement<T>(arr: T[]): T | undefined {
  return arr[0];
}

let numbers = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // تایپ‌اسکریپت می‌فهمه که T از نوع number هست

let strings = ["a", "b", "c"];
let firstString = getFirstElement(strings); // اینجا می‌فهمه که T از نوع string هست

اینترفیس‌های جنریک

می‌تونیم اینترفیس‌ها و کلاس‌ها رو هم به صورت جنریک تعریف کنیم.

interface Box<T> {
  contents: T;
}

let stringBox: Box<string> = { contents: "سلام" };
let numberBox: Box<number> = { contents: 100 };

تمرین! 🧠

یه تابع جنریک به اسم `wrapInArray` بنویس که یه ورودی از هر نوعی (`T`) بگیره و یه آرایه شامل فقط همون یه دونه عضو (`T[]`) رو برگردونه.

جواب تمرین

function wrapInArray<T>(input: T): T[] {
  return [input];
}

let numberArray = wrapInArray(5); // نوعش می‌شه: number[]
let stringArray = wrapInArray("hello"); // نوعش می‌شه: string[]

console.log(numberArray); // [5]
console.log(stringArray); // ["hello"]