مرکزی مواد پر جائیں
ماڈیول 3 · سبق 2 از 2کورس میں 6/14~15 min
ماڈیول اسباق (2/2)

بنیادی عمومیات

Generics (عام پروگرامنگ) TypeScript کی سب سے طاقتور خصوصیات میں سے ایک ہے۔ وہ آپ کو لچکدار، دوبارہ قابل استعمال اجزاء، فنکشنز، اور انٹرفیس لکھنے کی اجازت دیتے ہیں جو زیادہ سے زیادہ قسم کی حفاظت کو برقرار رکھتے ہوئے اور any کے استعمال سے گریز کرتے ہوئے مختلف ڈیٹا کی اقسام کے ساتھ کام کر سکتے ہیں۔


عام افعال

قسموں کے لیے ایک متغیر کے طور پر عام کے بارے میں سوچیں۔ آئیے ایک فنکشن پر غور کریں جو دلیل کے طور پر اس کو پاس کی گئی قدر واپس کرتا ہے:

TS
function identity<T>(arg: T): T {
  return arg;
}

خط T (Type کے لیے مختصر) قسم کے لیے پلیس ہولڈر ہے۔ جب ہم identity کو کال کرتے ہیں تو TypeScript پاس شدہ دلیل کی قسم کو پکڑ لیتا ہے اور خود بخود T کو اس قسم پر سیٹ کرتا ہے:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

عام انٹرفیس اور عرفی نام

جنرک کو انٹرفیس پر بھی لاگو کیا جا سکتا ہے اور عام کنٹینرز یا ڈیٹا ڈھانچے کی وضاحت کے لیے عرفی نام ٹائپ کیا جا سکتا ہے:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

ایک سے زیادہ قسم کے پیرامیٹرز

ہم ایسے افعال یا اقسام کی وضاحت کر سکتے ہیں جو متعدد قسم کے متغیرات کا استعمال کرتے ہیں (مثال کے طور پر، T اور U):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

عام پابندیاں

بعض اوقات ہم عام کی طرف سے قبول کردہ اقسام کو محدود کرنا چاہتے ہیں۔ ہم رکاوٹ شامل کرنے کے لیے extends کلیدی لفظ استعمال کر سکتے ہیں۔

مثال کے طور پر، اگر ہم چاہتے ہیں کہ عام قسم میں ہمیشہ ایک length خاصیت ہو (جیسے تار یا ارے):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

خود ہی آزمائیں۔

ورزش 1: عام شناخت کا فنکشن

ورزش#ts.m3.l2.e1
کوششیں: 0لوڈ ہو رہا ہے…

عام شناختی فنکشن کو مکمل کریں تاکہ یہ عام قسم T کے قدر پیرامیٹر کو قبول کرے اور اسے بغیر کسی ترمیم کے واپس کر دے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

واپسی کی قسم پیرامیٹر کی طرح ایک ہی عام قسم T ہونی چاہیے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش 2: عام باکس ریپر

ورزش#ts.m3.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

باکس کے نام سے ایک عام انٹرفیس کی وضاحت کریں جو ایک قسم کے پیرامیٹر T کو قبول کرتا ہے اور اس میں T قسم کے مواد کے نام سے ایک خاص خاصیت ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

انٹرفیس باکس استعمال کریں<T> { مواد: T; } نحو۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش 3: عام پابندی

ورزش#ts.m3.l2.e3
کوششیں: 0لوڈ ہو رہا ہے…

getLength کے نام سے ایک عام فنکشن لکھیں جو پیرامیٹر آرگ کو قبول کرتا ہے۔ arg ایک ایسے انٹرفیس تک محدود ہونا چاہیے جس میں لمبائی کی خاصیت (نمبر) ہو۔ فنکشن کو arg.length لوٹانا چاہیے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

فنکشن کو getLength<T extensed HasLength>(arg: T): نمبر اور واپسی arg.length کے بطور قرار دیں۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش 4: عام جوڑا

ورزش#ts.m3.l2.e4
کوششیں: 0لوڈ ہو رہا ہے…

دو خصوصیات کے ساتھ ایک عام انٹرفیس Pair<T, U> کی وضاحت کریں: پہلی قسم کی T اور دوسری قسم U۔ اگلا، ایک عام فنکشن makePair بنائیں جو پہلے (ٹائپ کی) اور دوسری (ٹائپ U) کو قبول کرے اور پیئر<T, U> کو نافذ کرنے والی چیز کو واپس کرے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

دو عام پیرامیٹرز Pair<T, U> کے لیے نحو کا استعمال کریں اور اس کے مطابق makePair کی وضاحت کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔