TypeScript में JSON प्रोसेसिंग: बेसिक पार्सिंग से सख्त टाइपिंग तक
\n\nTypeScript, JavaScript के ऊपर एक परत होने के नाते, JSON के साथ काम करने के सभी अंतर्निहित तरीकों को विरासत में लेता है, लेकिन उनमें एक शक्तिशाली टाइप सिस्टम जोड़ता है। हालाँकि, मानक JSON.parse() any प्रकार लौटाता है, जो स्टैटिक टाइपिंग के सभी लाभों को नकार देता है। इस लेख में, हम जानेंगे कि TypeScript में JSON को सुरक्षित और कुशलतापूर्वक कैसे संसाधित किया जाए, देशी क्षमताओं और विशेष लाइब्रेरीज़ दोनों का उपयोग करके।
मानक JSON.parse की समस्या
\n\nएक सामान्य परिदृश्य पर विचार करें:
\n\nconst jsonString = '{"name":"Alice","age":30}';\nconst user: any = JSON.parse(jsonString); // टाइप any\nconsole.log(user.name.toUpperCase()); // रनटाइम में त्रुटि, यदि name मौजूद नहीं है\n\nयदि JSON की संरचना अपेक्षित के अनुरूप नहीं है, तो TypeScript आपको चेतावनी नहीं देगा। समाधान - टाइप एशर्शन (type assertion) का उपयोग करना या, इससे भी बेहतर, रनटाइम के दौरान वैलिडेशन करना है।
\n\nबेसिक टाइप एशर्शन (Type Assertion)
\n\nसबसे आसान तरीका है परिणाम के प्रकार को स्पष्ट रूप से निर्दिष्ट करना:
\n\ninterface User {\n id: number;\n name: string;\n email?: string;\n}\n\nconst raw = '{"id":1,"name":"Bob"}';\nconst user = JSON.parse(raw) as User;\nconsole.log(user.name); // TypeScript जानता है कि यह string है\n\nनुकसान: यदि JSON अन्य फ़ील्ड के साथ आता है, तो त्रुटि केवल रनटाइम में होगी। बाहरी API के साथ काम करते समय यह असुरक्षित है।
\n\nJSON के लिए रिकर्सिव और कंडीशनल टाइप्स
\n\nTypeScript आपको रिकर्सिव टाइप के माध्यम से किसी भी JSON का वर्णन करने की अनुमति देता है:
\n\ntype JSONValue = \n | string\n | number\n | boolean\n | null\n | JSONValue[]\n | { [key: string]: JSONValue };\n\nfunction safeParse(json: string): JSONValue | Error {\n try {\n return JSON.parse(json) as JSONValue;\n } catch (e) {\n return new Error('Invalid JSON');\n }\n}\n\nयह दृष्टिकोण सुनिश्चित करता है कि परिणाम हमेशा एक मान्य JSON संरचना होगी, लेकिन विशिष्ट रूप की जाँच नहीं करता है।
\n\nZod लाइब्रेरी — रनटाइम पर स्कीमा वैलिडेशन
\n\nZod TypeScript में डेटा के डिक्लेरेटिव वैलिडेशन के लिए सबसे लोकप्रिय लाइब्रेरी है। यह आपको एक स्कीमा का वर्णन करने और उससे स्वचालित रूप से एक प्रकार प्राप्त करने की अनुमति देता है।
\n\nइंस्टॉलेशन
\nnpm install zod\n\nउपयोग का उदाहरण
\n\nimport { z } from 'zod';\n\n// स्कीमा का वर्णन करें\nconst UserSchema = z.object({\n id: z.number().positive(),\n name: z.string().min(1),\n email: z.string().email().optional(),\n role: z.enum(['admin', 'user']).default('user'),\n});\n\n// स्कीमा से प्रकार निकालें\ntype User = z.infer<typeof UserSchema>;\n\n// सुरक्षित पार्सिंग\nconst result = UserSchema.safeParse(JSON.parse(rawJson));\n\nif (result.success) {\n // result.data का प्रकार User है\n console.log(result.data.name);\n} else {\n console.error(result.error.format());\n}\n\nZod स्वचालित रूप से प्रकार, फ़ील्ड की अनिवार्यता, डिफ़ॉल्ट मानों की जाँच करता है और विस्तृत त्रुटियाँ लौटाता है। REST API या कॉन्फ़िगरेशन फ़ाइलों से डेटा संसाधित करने के लिए यह एक आदर्श विकल्प है।
\n\nio-ts लाइब्रेरी — कार्यात्मक दृष्टिकोण
\n\nio-ts कार्यात्मक प्रोग्रामिंग और fp-ts लाइब्रेरी पर आधारित है। यह डेटा को डिकोड/एनकोड करने के लिए कोडेक्स (codecs) के संयोजन का उपयोग करता है।
\n\nउदाहरण
\n\nimport * as t from 'io-ts';\nimport { isRight } from 'fp-ts/lib/Either';\n\nconst UserCodec = t.type({\n id: t.number,\n name: t.string,\n tags: t.array(t.string),\n});\n\nconst decoded = UserCodec.decode(JSON.parse(raw));\n\nif (isRight(decoded)) {\n // decoded.right — टाइप किया गया ऑब्जेक्ट\n console.log(decoded.right.name);\n} else {\n // decoded.left — वैलिडेशन त्रुटियाँ\n console.log(decoded.left);\n}\n\nio-ts अधिक सख्त और गणितीय रूप से सही है, लेकिन इसके लिए कार्यात्मक अवधारणाओं (Either, pipe) की समझ की आवश्यकता होती है।
\n\n