TypeScript में उन्नत साक्षात्कार: नियोक्ता को कैसे प्रभावित करें
\nTypeScript लंबे समय से JavaScript पर केवल एक "ओवरले" नहीं रह गया है। आधुनिक साक्षात्कारों में Senior पदों के लिए न केवल प्रकारों का ज्ञान, बल्कि सशर्त प्रकारों, मैपिंग, डेकोरेटर और प्रकार अनुमान प्रणाली के साथ काम करने की क्षमता की भी जाँच की जाती है। इस लेख में, हम 4 मुख्य विषयों पर चर्चा करेंगे जो आपको TypeScript में उन्नत स्तर पर तकनीकी साक्षात्कार को आत्मविश्वास से पास करने में मदद करेंगे।
\n\n1. सशर्त प्रकार (Conditional Types) और infer कीवर्ड
\nसशर्त प्रकार आपको एक शर्त के आधार पर दो प्रकारों में से एक चुनने की अनुमति देते हैं। वे टर्नरी ऑपरेटर के सिद्धांत पर बनाए गए हैं: T extends U ? X : Y। साक्षात्कार में, आपसे एक ऐसा प्रकार लिखने के लिए कहा जा सकता है जो किसी फ़ंक्शन के रिटर्न प्रकार को निकालता है।
// उदाहरण: फ़ंक्शन के रिटर्न प्रकार को निकालना\ntype ReturnTypeExtract<T> = T extends (...args: any[]) => infer R ? R : never;\n\nfunction greet(name: string): string {\n return "Hello, " + name;\n}\n\ntype GreetReturn = ReturnTypeExtract<typeof greet>; // string\n\nकीवर्ड infer का उपयोग सशर्त प्रकारों के अंदर एक नया प्रकार वेरिएबल घोषित करने के लिए किया जाता है। यह आपको जटिल संरचना से प्रकार का एक हिस्सा "निकालने" की अनुमति देता है। अक्सर पूछा जाता है: "infer क्या है और इसका उपयोग कहाँ किया जाता है?" उत्तर: Promises, फ़ंक्शन, tuples से प्रकार निकालने के लिए।
// Promise से एलिमेंट का प्रकार निकालना\ntype UnwrapPromise<T> = T extends Promise<infer U> ? U : T;\n\ntype Result = UnwrapPromise<Promise<number>>; // number\ntype Result2 = UnwrapPromise<string>; // string\n\n2. मैप किए गए प्रकार (Mapped Types) और readonly/optional मॉडिफायर
\nमैप किए गए प्रकार आपको मौजूदा प्रकार के गुणों को पुनरावृत्त करके नए प्रकार बनाने की अनुमति देते हैं। यह Partial<T> या Readonly<T> जैसे उपयोगिता प्रकार बनाने के लिए एक शक्तिशाली उपकरण है। साक्षात्कार में, आपसे Pick<T, K> का अपना एनालॉग लागू करने के लिए कहा जा सकता है।
// Pick का स्वयं का कार्यान्वयन\ntype MyPick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\ninterface User {\n id: number;\n name: string;\n email: string;\n}\n\ntype UserBasic = MyPick<User, 'id' | 'name'>;\n// { id: number; name: string }\n\nkeyof T पर ध्यान दें - यह एक ऑपरेटर है जो ऑब्जेक्ट की कुंजियों का यूनियन लौटाता है। मैपिंग के साथ संयोजन में, यह प्रकारों को लचीले ढंग से बदलने की अनुमति देता है। साथ ही, readonly और ? (optional) मॉडिफायर के बारे में अक्सर पूछा जाता है। उन्हें + और - उपसर्गों का उपयोग करके जोड़ा या हटाया जा सकता है:
// सभी गुणों से readonly हटाना\ntype Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\ntype ImmutableUser = Readonly<User>;\ntype MutableUser = Mutable<ImmutableUser>; // सभी फ़ील्ड फिर से परिवर्तनीय\n\n3. डेकोरेटर और उनकी टाइपिंग
\nडेकोरेटर TypeScript की एक प्रायोगिक सुविधा है जिसका उपयोग Angular और NestJS में सक्रिय रूप से किया जाता है। साक्षात्कार में, आपसे पूछा जा सकता है कि क्लास या मेथड डेकोरेटर को कैसे टाइप किया जाए। यह समझना महत्वपूर्ण है कि डेकोरेटर केवल एक फ़ंक्शन है जो लक्ष्य ऑब्जेक्ट को स्वीकार करता है और उसे (या एक नया) लौटाता है।
\n\n// टाइपिंग के साथ क्लास डेकोरेटर\nfunction Logger<T extends { new (...args: any[]): {} }>(constructor: T) {\n console.log(`Class ${constructor.name} created`);\n return class extends constructor {\n constructor(...args: any[]) {\n super(...args);\n console.log('Instance created');\n }\n };\n}\n\n@Logger\nclass MyService {\n constructor(public name: string) {}\n}\n\nconst service = new MyService('Test'); \n// कंसोल में: "Class MyService created", फिर "Instance created"\n\nउन्नत प्रश्नों में, आपसे एक डेकोरेटर लागू करने के लिए कहा जा सकता है जो मेटाडेटा या सत्यापन जोड़ता है। जेनेरिक के उपयोग पर ध्यान दें — <T extends { n