TypeScript بڑے پیمانے پر ویب ڈیولپمنٹ کے لیے صنعتی معیار بن چکا ہے۔ اگرچہ زیادہ تر ڈیولپرز انٹرفیسز اور ٹائپس کی بنیادی باتیں جانتے ہیں، لیکن اصل طاقت اس کے ایڈوانسڈ ٹائپ سسٹم میں ہے۔ یہاں 5 پیٹرنز ہیں جو آپ کو ایک سینیئر انجینیئر کے طور پر ممتاز کریں گے۔
1. Generic Constraints
Generics طاقتور ہیں، لیکن بعض اوقات آپ کو محدود کرنے کی ضرورت ہوتی ہے کہ کیا پاس کیا جا سکتا ہے۔ extends یہاں آپ کا ساتھی ہے۔
interface HasId { id: string; } function getById<T extends HasId>(list: T[], id: string): T | undefined { return list.find((item) => item.id === id); }
T کو HasId ایکسٹینڈ کرنے کو یقینی بنا کر، ہم اس بات کی ضمانت دیتے ہیں کہ فنکشن کے اندر .id تک رسائی محفوظ ہے۔
2. Conditional Types
Conditional types آپ کو غیر یکساں ٹائپ میپنگز بنانے کی اجازت دیتے ہیں۔ سنٹیکس JavaScript میں ٹرنری آپریٹر کی طرح ہے۔
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
ایک عملی استعمال union سے ٹائپس کو فلٹر کرنا ہے:
type Diff<T, U> = T extends U ? never : T; type NonNullable<T> = Diff<T, null | undefined>;
3. Mapped Types
Mapped types آپ کو پراپرٹیز کو تبدیل کر کے پرانی ٹائپس کی بنیاد پر نئی ٹائپس بنانے کی اجازت دیتے ہیں۔
type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; interface User { name: string; age: number; } type ReadOnlyUser = ReadOnly<User>;
آپ موڈیفائرز بھی شامل یا ہٹا سکتے ہیں:
type Mutable<T> = { -readonly [P in keyof T]: T[P]; };
4. Template Literal Types
TypeScript 4.1 میں متعارف کرائے گئے، یہ آپ کو سٹرنگ ٹائپس کو براہ راست مینیپولیٹ کرنے دیتے ہیں۔
type World = 'world'; type Greeting = `hello ${World}`; // "hello world" type Color = 'red' | 'blue'; type Quantity = 'light' | 'dark'; type Palette = `${Quantity}-${Color}`; // "light-red" | "light-blue" | "dark-red" | "dark-blue"
یہ مخصوص پیٹرن فالو کرنے والی سٹرنگز کو ٹائپ کرنے کے لیے ناقابل یقین حد تک مفید ہے، جیسے CSS کلاسز یا ایونٹ کے نام۔
5. infer کلیدی لفظ
Conditional types کے اندر infer کلیدی لفظ آپ کو دوسری ٹائپس سے ٹائپس نکالنے کی اجازت دیتا ہے۔
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; function check(): boolean { return true; } type CheckReturn = ReturnType<typeof check>; // boolean
یہاں، ہم TypeScript سے کہہ رہے ہیں کہ فنکشن کی واپسی ٹائپ R کو "اخذ" کرے اور اسے واپس کرے۔
نتیجہ
ان پیٹرنز میں مہارت حاصل کرنا آپ کو ایسی لائبریریز اور یوٹیلیٹیز لکھنے کی اجازت دیتا ہے جو مضبوط ہوں اور بہترین ڈیولپر تجربہ (DX) فراہم کریں۔ ایڈوانسڈ TypeScript کا مقصد پیچیدگی کی خاطر پیچیدگی نہیں ہے، بلکہ حفاظت اور اظہار کی صلاحیت ہے۔