TypeScript में 'as' ऑपरेटर खतरनाक क्यों है?

आप TypeScript का उपयोग इसकी सुरक्षा के लिए करते हैं, लेकिन आपने शायद देखा होगा कि as ऑपरेटर कम्पाइलेशन को तब भी फोर्स कर सकता है जब TypeScript असंगत टाइप्स का संदेह करता है। यह लचीलापन आकर्षक हो सकता है, लेकिन इसमें अक्सर खतरे छिपे होते हैं। आइए जानें कि as का अत्यधिक उपयोग रनटाइम एरर को कैसे जन्म दे सकता है और इन खतरों से कैसे बचा जा सकता है।

as की समस्या: कम्पाइलेशन में छिपी हुई त्रुटियां

TypeScript में, as ऑपरेटर एक type assertion करने की अनुमति देता है, यानी TypeScript को कहना "मुझ पर भरोसा करो, मैं जानता हूं मैं क्या कर रहा हूं।" हालांकि, यह टूल कभी-कभी एक बुरा विचार हो सकता है, क्योंकि यह टाइप चेक को बायपास करता है। जब आप as का उपयोग करते हैं, तो आप टाइप के सही होने की जिम्मेदारी लेते हैं, भले ही TypeScript इसे वेरिफाई नहीं कर सकता। आइए कुछ ठोस उदाहरणों से इसे समझें।

उदाहरण 1: as के साथ ऐसा टाइप फोर्स करना जो वास्तव में कम्पैटिबल नहीं है

मान लीजिए आपके पास एक Person टाइप का ऑब्जेक्ट है जिसमें कुछ निश्चित प्रॉपर्टीज़ हैं, लेकिन आप as का उपयोग करके इसे एक अलग टाइप में फोर्स करते हैं, यह सोचकर कि यह काम करेगा।

typescript
1type Person = {
2 name: string;
3 age: number;
4};
5
6type Employee = {
7 name: string;
8 age: number;
9 role: string;
10};
11
12const person: Person = { name: 'Alice', age: 30 };
13
14// person को Employee में फोर्स करना, भले ही 'role' डिफाइन नहीं है
15const employee = person as Employee;
16
17console.log(employee.role); // रनटाइम एरर: 'role' undefined है

इस उदाहरण में, employee के पास role प्रॉपर्टी नहीं है, लेकिन as की वजह से TypeScript कम्पाइलेशन के दौरान कोई एरर नहीं देता। हालांकि, रनटाइम पर, employee.role undefined है, जो एरर का कारण बन सकता है यदि आपका कोड string टाइप की वैल्यू की उम्मीद करता है।

उदाहरण 2: as unknown as के साथ चेक को बायपास करना

कभी-कभी, डेवलपर्स unknown के माध्यम से एक टाइप को फोर्स करने के लिए चेन कास्टिंग का उपयोग करते हैं, जैसा कि इस उदाहरण में:

typescript
1function processData(data: any) {
2 // data को नंबर में फोर्स करना, भले ही यह नंबर न हो
3 const numberData = data as unknown as number;
4 console.log(numberData + 10);
5}
6
7processData('text'); // रनटाइम एरर: NaN

यहां, हम एक data वैल्यू लेते हैं जो कुछ भी हो सकती है, और इसे unknown के माध्यम से number में कास्ट करते हैं। कम्पाइलेशन पर, सब कुछ ठीक लगता है, लेकिन रनटाइम पर, एडिशन NaN उत्पन्न करता है क्योंकि data वास्तव में एक स्ट्रिंग थी।

उदाहरण 3: आंशिक ऑब्जेक्ट्स को मैनिपुलेट करना

एक और क्लासिक केस देखें जहां हम एक आंशिक रूप से पूर्ण ऑब्जेक्ट को पूर्ण टाइप में फोर्स करते हैं, यह सोचकर कि सब ठीक रहेगा:

typescript
1type Product = {
2 id: number;
3 name: string;
4 price: number;
5};
6
7const partialProduct = { id: 1, name: 'Book' } as Product;
8
9console.log(partialProduct.price); // रनटाइम एरर: 'price' undefined है

partialProduct ऑब्जेक्ट को Product में कन्वर्ट किया गया है, जबकि इसमें price प्रॉपर्टी मौजूद नहीं है। as की वजह से TypeScript इस कमी को नहीं पकड़ता, लेकिन यह undefined की ओर ले जाता है जो पूर्व जांच के बिना इस्तेमाल किए जाने पर रनटाइम एरर उत्पन्न कर सकता है।

Zod के साथ त्रुटियों से कैसे बचें

as द्वारा उत्पन्न समस्याओं से बचने के लिए, एक अच्छी प्रैक्टिस है डेटा को रनटाइम पर वैलिडेट करना, विशेष रूप से यदि वह किसी बाहरी स्रोत से आता है। यहीं पर Zod काम आता है। Zod एक TypeScript स्कीमा वैलिडेशन लाइब्रेरी है जो सुरक्षित टाइप को परिभाषित करने और उन्हें रनटाइम पर वैलिडेट करने की अनुमति देती है।

Zod के साथ, as के साथ टाइप फोर्स करने के बजाय, आप एक पूर्वनिर्धारित स्कीमा के साथ डेटा को वैलिडेट और कन्वर्ट कर सकते हैं। उदाहरण के लिए:

typescript
1import { z } from 'zod';
2
3// Product के लिए स्कीमा की परिभाषा
4const ProductSchema = z.object({
5 id: z.number(),
6 name: z.string(),
7 price: z.number(),
8});
9
10// Zod के साथ डेटा वैलिडेशन
11const result = ProductSchema.safeParse(partialProduct);
12
13if (result.success) {
14 const product = result.data;
15 console.log('वैध प्रोडक्ट:', product);
16} else {
17 console.error('वैलिडेशन एरर:', result.error.errors);
18}

इस उदाहरण में, Zod जांचता है कि partialProduct Product स्कीमा का पालन करता है या नहीं। यदि कोई प्रॉपर्टी गायब है, तो Zod undefined वैल्यू को पास करने देने के बजाय एक वैलिडेशन एरर लौटाता है। Zod की मदद से, आप अपने डेटा को सुरक्षित करते हैं और अपूर्ण या गलत टाइप से संबंधित रनटाइम एरर से बचते हैं।

निष्कर्ष

as ऑपरेटर TypeScript के चेक को बायपास करने का एक त्वरित समाधान हो सकता है, लेकिन यह रनटाइम एरर का जोखिम पैदा करता है, विशेष रूप से जब बिना वैलिडेशन के टाइप फोर्स किए जाते हैं। Zod जैसी लाइब्रेरी का उपयोग करके, आप रनटाइम पर अपने डेटा को वैलिडेट कर सकते हैं और इस प्रकार TypeScript की सुरक्षा का पूरा लाभ उठा सकते हैं, यहां तक कि उन मामलों में भी जहां as एकमात्र समाधान लगता था।

इस लेख को साझा करें


Sébastien Timoner

Sébastien TIMONER

लीड डेवलपर
कस्टम डेवलपमेंट विशेषज्ञ
Aix-en-Provence, France

वेब विकास और तकनीकी टीम प्रबंधन में विशेषज्ञ, मैं प्रभावी डिजिटल समाधानों के निर्माण और अनुकूलन में विशेषज्ञता रखता हूं। React.js, Node.js, TypeScript और Symfony जैसी आधुनिक तकनीकों की गहरी समझ के साथ, मैं offroadLabs में विभिन्न क्षेत्रों की कंपनियों के लिए जटिल SaaS परियोजनाओं की सफलता सुनिश्चित करता हूं, डिजाइन से लेकर प्रोडक्शन तक।

offroadLabs में, मैं तकनीकी विशेषज्ञता और सहयोगात्मक दृष्टिकोण को जोड़ते हुए कस्टम विकास सेवाएं प्रदान करता हूं। चाहे एक नवीन SaaS समाधान बनाना हो, मौजूदा एप्लिकेशन को आधुनिक बनाना हो, या एक टीम के कौशल विकास में सहायता करना हो, मैं प्रत्येक परियोजना की विशिष्ट आवश्यकताओं के अनुरूप मजबूत और प्रभावी समाधान प्रदान करने के लिए प्रतिबद्ध हूं।

मैं ऐक्स-एन-प्रोवेंस के आसपास या पूर्ण रिमोट असाइनमेंट के लिए उपलब्ध हूं।