جیسے جیسے ٹائپ اسکرپٹ بڑھ رہا ہے اور حال ہی میں مقبولیت حاصل کر رہا ہے، زیادہ سے زیادہ جاوا اسکرپٹ ڈویلپر قسم کی حفاظت کی تعریف کرتے ہیں۔ ٹائپ اسکرپٹ کی فراہم کردہ خصوصیات کی فہرست بہت بڑی ہے اور ہو سکتا ہے کہ بہت زیادہ ہو، اس لیے اس پوسٹ میں، میں ان میں سے ایک پر توجہ مرکوز کروں گا جسے سمجھنا آسان ہے اور اس کا عملی اثر ہے۔
آئیے ایک مثال سے شروع کرتے ہیں۔ تصور کریں کہ آپ بہت سے صارف کے کرداروں کے ساتھ ایک ایپلیکیشن تیار کر رہے ہیں۔ مختلف صارفین کے ذریعہ کسی ایپلیکیشن کا استعمال کرنا کافی عام ہے، ہے نا؟ قطعی کردار یہاں واقعی اہم نہیں ہیں، لیکن ہم کہتے ہیں کہ وہ admin
، consumer
اور guest
ہیں۔ ٹائپ اسکرپٹ میں، ہم ان کرداروں کے حامل صارفین کو درج ذیل قرار دے سکتے ہیں:
type Admin = {} type Consumer = {} type Guest = {}
اب، آئیے ہر صارف کے کردار کے اوصاف کے ایک سیٹ پر غور کریں۔ عام طور پر، وہ email
، firstName
اور lastName
یا اس جیسا کچھ ہوتے ہیں۔ لیکن، انتظار کریں، Guest
صارفین کے پاس شاید وہ نہیں ہوں گے (وہ آخر کار مہمان ہیں)، تو آئیے ابھی اس قسم کو خالی چھوڑ دیں۔
type Admin = { firstName: string lastName: string email: string } type Consumer = { firstName: string lastName: string email: string } type Guest = {}
ایپلیکیشن کا صارف صرف ایک کردار کا ہو سکتا ہے۔ اقسام کے ذریعے اس کی نمائندگی کرنے کا طریقہ union
قسم کا استعمال کرنا ہے۔
type User = Admin | Consumer | Guest
منتظمین اپنی خصوصی صلاحیتوں کے لیے مشہور ہیں، اور ہماری درخواست میں، وہ صارفین کو مدعو کرنے کے اہل ہیں۔ آئیے ایک فیلڈ شامل کریں جس سے ظاہر ہوتا ہے کہ ایک منتظم کتنے دعوت نامے بھیج سکتا ہے۔
type Admin = { firstName: string lastName: string email: string numberOfInvitesLeft: number // <-- added }
چیزوں کو مزید دلچسپ اور حقیقی ایپلیکیشن کے قریب تر بنانے کے لیے، آئیے Consumer
قسم کے لیے خصوصی پراپرٹی شامل کریں۔
type Consumer = { firstName: string lastName: string email: string premium: boolean // <-- added }
یہ ایک بہت ہی سادہ مثال ہے، اور حقیقت میں، صارفین کے پاس درجنوں مختلف خصوصیات ہو سکتی ہیں، جو کہ کوڈبیس کو کافی حد تک پیچیدہ بنا دیتی ہیں جب آپ کو مخصوص خصوصیات تک رسائی کی ضرورت ہوتی ہے۔
const doSomethingBasedOnRole = (user: User) => { // how do you check here that user is really an admin if (user) { // ...and do something with the `numberOfInvitesLeft` property? } }
ایک آپشن جائیداد کے وجود کی جانچ کرنا ہے۔
const doSomethingBasedOnRole = (user: User) => { if (user && user.numberOfInvitesLeft) { // safely access `numberOfInvitesLeft` property } }
لیکن یہ ایک تکلیف دہ اور قابل توسیع حل نہیں ہے۔ اور جب `numberOfInvitesLeft` ایک اختیاری پراپرٹی بن جائے تو کیا کریں؟
یہ وہ جگہ ہے جہاں امتیازی یونین کی اقسام کھیل میں آتی ہیں۔ ہمیں صرف ہر صارف کی قسم میں ایک اضافی فیلڈ ڈالنے کی ضرورت ہے جو کردار کی نشاندہی کرتا ہے۔
type Admin = { firstName: string lastName: string email: string numberOfInvitesLeft: number role: "admin" // <-- added } type Consumer = { firstName: string lastName: string email: string role: "consumer" // <-- added } type Guest = { role: "guest" // <-- added }
غور کریں کہ میں کس طرح ایک مخصوص سٹرنگ کو بطور قسم ڈال رہا ہوں؛ اسے سٹرنگ لٹریل ٹائپ کہا جاتا ہے۔ اس سے آپ کو کیا ملتا ہے کہ اب آپ مقامی جے ایس لینگویج آپریٹرز کو استعمال کر سکتے ہیں، مثال کے طور پر، switch case
, if
, else
کردار میں امتیاز کرنے کے لیے۔
const user: Admin = { firstName: "John", lastName: "Smith", email: "[email protected]", numberOfInvitesLeft: 3, role: "admin", } const doSomethingBasedOnRole = (user: User) => { if (user.role === "admin") { // now typescript knows that INSIDE of this block user is of type `Admin` // now you can safely call `user.numberOfInvitesLeft` within this block } }
سوئچ کیس کے بیان پر بھی یہی لاگو ہوتا ہے۔
// ... const doSomethingBasedOnRole = (user: User) => { switch (user.role) { case "admin": { // now typescript knows that INSIDE of this block user is of type `Admin` // now you can safely call `user.numberOfInvitesLeft` within this block } case "consumer": { // do something with a `Consumer` user // if you try to call `user.numberOfInvitesLeft` here, TS compiler errors in // // "Property 'numberOfInvitesLeft' does not exist on type 'Consumer'." // } } }
امتیازی یونین کی اقسام کے فوائد واضح ہیں کیونکہ قسم کی جانچ واضح کردار کی خاصیت پر مبنی ہے نہ کہ ایڈہاک خصوصیات پر جو کہ کسی مخصوص صارف سے متعلق ہو یا نہ ہو۔