ماڈیول اسباق (2/2)
لغوی قسمیں اور دعوے
TypeScript متغیرات کی ممکنہ قدروں کو کم کرنے اور جب ضروری ہو تو کمپائلر کو مزید مخصوص اقسام کو پہچاننے پر مجبور کرنے کے لیے جدید ٹولز فراہم کرتا ہے۔
لغوی اقسام
ایک لغوی قسم ایک قطعی، واحد قدر کی نمائندگی کرتی ہے (مثال کے طور پر، ایک مخصوص تار یا نمبر)۔ وہ عام طور پر یونین کی اقسام کے ساتھ مل جاتے ہیں:
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;
light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLightقسم کے دعوے (as)
بعض اوقات آپ کے پاس کسی قسم کے بارے میں معلومات ہوتی ہیں جو ٹائپ اسکرپٹ کو مرتب کرنے کے وقت معلوم نہیں ہوتی۔ ان صورتوں میں، آپ as کلیدی لفظ کا استعمال کرتے ہوئے قسم کا دعویٰ استعمال کر سکتے ہیں:
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;دعویٰ مرتب کرنے والے کو بتاتا ہے: "مجھ پر بھروسہ کریں، میں جانتا ہوں کہ یہ عنصر ایک HTMLCanvasElement ہے"۔ یہ رن ٹائم پر کوئی چیک یا کاسٹ نہیں کرتا ہے۔ یہ صرف ٹائپ چیکر کی مدد کرتا ہے۔
Const کے دعوے (as const)
جب ہم const کے ساتھ کسی آبجیکٹ یا صف کا اعلان کرتے ہیں، TypeScript پھر بھی اس کی اندرونی خصوصیات میں ترمیم کرنے کی اجازت دیتا ہے۔ آخر میں as const کو شامل کرنے سے، پورا ڈھانچہ منجمد اور صرف پڑھنے کے لیے بنایا جاتا ہے، تمام خصوصیات کو ان کی قطعی لغوی قسموں میں تبدیل کرتے ہوئے:
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-onlyسانچہ لغوی اقسام
تمثیل کی لغوی قسمیں JavaScript ٹیمپلیٹ کے تاروں کے اوپر بنی ہیں، لیکن قسم کی پوزیشنوں میں استعمال ہوتی ہیں۔ وہ ایک سے زیادہ لغوی اقسام کو یکجا کرنے کی اجازت دیتے ہیں:
type Size = 'small' | 'large';
type Color = 'red' | 'blue';
// Creates the union: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;تمثیل لغوی اقسام میں سٹرنگ یوٹیلیٹیز
TypeScript Template Literal Types کے اندر حروف کو جوڑتوڑ کرنے کے لیے خصوصی افادیت کی اقسام فراہم کرتا ہے:
Capitalize<StringType>: سٹرنگ کے پہلے حرف کو بڑا کرتا ہے۔Uncapitalize<StringType>: سٹرنگ کے پہلے حرف کو غیر کیپیٹلائز کرتا ہے۔Uppercase<StringType>: پورے سٹرنگ کو بڑے حروف میں تبدیل کرتا ہے۔Lowercase<StringType>: پوری سٹرنگ کو چھوٹے حروف میں تبدیل کرتا ہے۔
type ActionType = 'click' | 'hover';
// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;خود ہی آزمائیں۔
مشق 1: سمت لٹریل یونین
سمت نام کی ایک لفظی قسم کی وضاحت کریں جو صرف 'اوپر'، 'نیچے'، 'بائیں'، یا 'دائیں' کو قبول کرتی ہے۔ پھر ایک فنکشن کا اعلان کریں جس کا نام move(dir: Direction): سٹرنگ ہے جو موصول ہونے والی سمت کے بعد سٹرنگ 'Moving' کو لوٹاتا ہے۔
اشارہ دکھائیں۔
پہلے قسم کے عرف کی وضاحت کریں چار آپشنز کے ساتھ جو کہ |
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 2: JSON.parse پر دعوی
JSON.parse فنکشن کسی بھی قسم کو بطور ڈیفالٹ واپس کرتا ہے۔ parseUser فنکشن میں ترمیم کریں تاکہ JSON.parse(json) کا نتیجہ بطور کلیدی لفظ استعمال کرتے ہوئے قسم { username: string } کے طور پر ظاہر کیا جائے۔
اشارہ دکھائیں۔
JSON.parse(json) کال کے فوراً بعد 'بطور { username: string }' شامل کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 3: واقعات کے لیے لفظی سانچہ
اسٹیٹس اور ایکشن کی اقسام کو دیکھتے ہوئے، 'Status-Action' فارمیٹ میں ایونٹ کے نام سے ایک ٹیمپلیٹ سٹرنگ کی قسم کی وضاحت کریں (مثال کے طور پر، 'اوپن-کلک')۔
اشارہ دکھائیں۔
قسم کی وضاحت کے لیے بیک ٹِکس کا استعمال کریں، اور اندر ${Status}-${Action} نحو۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 4: کیپٹلائز کے ساتھ تمثیل لٹریل ٹائپ
ایک لفظی قسم کے واقعہ کی وضاحت کریں جو 'کلک' یا 'ہوور' ہو سکتا ہے۔ پھر، ایک قسم کا اعلان کرنے کے لیے Template Literal Types کا استعمال کریں EventHandler کی شکل میں سٹرنگز کی نمائندگی کرنے والے اس کے بعد بڑے ایونٹ کا نام (یعنی 'onClick' یا 'onHover')۔
اشارہ دکھائیں۔
تقریب کے پہلے حرف کو بڑا کرنے کے لیے کیپٹلائز <ایونٹ> کا استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔