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

افادیت کی اقسام

TypeScript عام قسم کی تبدیلیوں کی سہولت کے لیے کئی عالمی یوٹیلیٹی اقسام فراہم کرتا ہے۔ یہ قسمیں عام ہیں اور آپ کو موجودہ اقسام سے اعلانیہ طور پر نئی اقسام بنانے کی اجازت دیتی ہیں۔

چار سب سے زیادہ استعمال ہونے والی افادیت کی اقسام ہیں:

1. Partial<T>

ایک قسم کی تمام خصوصیات کو T اختیاری بناتا ہے۔ یہ اپ ڈیٹ/پیچ فنکشنز کے لیے انتہائی مفید ہے جہاں کال کرنے والا صرف فیلڈز کا سب سیٹ فراہم کر سکتا ہے:

TS
interface User {
  id: number;
  name: string;
  email: string;
}

// All properties of User become optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;

2. Readonly<T>

ایک قسم کی تمام خصوصیات کو T صرف پڑھنے بناتا ہے۔ کسی پراپرٹی کو دوبارہ تفویض کرنے کی کوئی بھی کوشش کمپائل ٹائم کمپائلر کی خرابی کو متحرک کرے گی۔

TS
interface Point {
  x: number;
  y: number;
}

const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Error: cannot assign to 'x' because it is a read-only property

3. Pick<T, Keys>

قسم T سے کلیدوں کے صرف ایک مخصوص سیٹ (سٹرنگ یونین کے ذریعہ پیش کردہ) کو منتخب کرکے ایک قسم تخلیق کرتا ہے:

TS
interface Article {
  id: number;
  title: string;
  content: string;
  views: number;
}

// Selects only 'title' and 'views': { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;

4. Omit<T, Keys>

قسم T سے کلیدوں کے مخصوص سیٹ کو ہٹا کر ایک قسم بناتا ہے۔ یہ Pick کا دوہری ہے:

TS
interface Product {
  id: number;
  name: string;
  price: number;
  secretVendorCode: string;
}

// Removes 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;

5. Record<Keys, Type>

ایک آبجیکٹ کی قسم بناتا ہے جس کی پراپرٹی کیز ہیں Keys اور جس کی پراپرٹی کی قدریں Type ہیں۔ یہ اقدار کی کلیدوں کی نقشہ سازی کے لیے انتہائی مفید ہے، لغات یا ہیش ٹیبلز (کلیدی قدر کے نقشے):

TS
type Page = 'home' | 'about' | 'contact';

interface PageInfo {
  title: string;
}

// Creates a dictionary with keys 'home' | 'about' | 'contact' and values PageInfo
const nav: Record<Page, PageInfo> = {
  home: { title: 'Home Page' },
  about: { title: 'About Us' },
  contact: { title: 'Contact Us' },
};

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

مشق 1: جزوی کے ساتھ پروفائل اپ ڈیٹ

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

UpdateProfile فنکشن کو مکمل کریں جو ایک اصل پروفائل (پروفائل) اور ایک اپڈیٹس آبجیکٹ (اپ ڈیٹس) کو قبول کرتا ہے جہاں پروفائل کے تمام فیلڈز اختیاری ہیں۔ اسے اصل خصوصیات کو اپ ڈیٹس کے ساتھ ملا کر ایک نیا پروفائل آبجیکٹ واپس کرنا ہوگا۔

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

اپ ڈیٹس پیرامیٹر کے لیے جزوی&lt;پروفائل&gt; یوٹیلیٹی کی قسم، اور اشیاء کو ضم کرنے کے لیے اسپریڈ آپریٹر کا استعمال کریں: { ...اصل، ...اپڈیٹس }۔

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

ورزش 2: حساس کھیتوں کو اومیٹ کے ساتھ ہٹانا

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

UserAccount کی قسم کو دیکھتے ہوئے، SafeUser نام کی ایک قسم عرف کی وضاحت کریں جو حساس پاس ورڈ ہیش پراپرٹی کو چھوڑ دیتا ہے۔

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

استعمال کریں قسم SafeUser = Omit<UserAccount, 'passwordHash'>; مخصوص فیلڈ کو چھوڑنے کے لیے۔

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

مشق 3: پک اور صرف پڑھنے کے ساتھ عوامی ترتیب

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

AppConfig کی قسم کو دیکھتے ہوئے، PublicConfig کے نام سے ایک قسم کے عرف کی وضاحت کریں جو صرف پڑھنے کے لیے (صرف پڑھنے والا) ورژن ہے جس میں صرف apiEndpoint اور پورٹ کی خصوصیات کو Pick کے ذریعے منتخب کیا گیا ہے۔

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

استعمال کی قسم PublicConfig = صرف پڑھنے <Pick&lt;AppConfig، 'apiEndpoint' | 'پورٹ'>>؛

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

مشق 4: ریکارڈ اور صرف پڑھنے کے ساتھ صارف کی رجسٹری

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

فیلڈز id: نمبر اور نام: سٹرنگ کے ساتھ یوزر انٹرفیس دیتے ہوئے، ایک قسم ReadOnlyUser بنائیں جو تمام فیلڈز کو صرف صارف کے لیے بنائے۔ پھر، ایک قسم UserRegistry بنائیں جو ایک لغت کی نمائندگی کرتی ہے جہاں کلید ایک سٹرنگ ہے (مثال کے طور پر، سٹرنگ آئی ڈی) اور قدر ایک ReadOnlyUser ہے۔

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

ReadOnlyUser کی وضاحت کے لیے Readonly<User> استعمال کریں، اور رجسٹری کے لیے Record&lt;string، ReadOnlyUser> کا استعمال کریں۔

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