परिचय: Stack Overflow पर object literal का टॉपिक आज भी क्यों ट्रेंड करता है?
\n\nअगर आपने कभी TypeScript में कोड लिखा है, तो आपने शायद यह महसूस किया होगा: आप एक ऑब्जेक्ट बनाते हैं, उसका टाइप बताते हैं, और कंपाइलर या तो एरर देता है या, उससे भी बुरा, कोई एरर नहीं देता, लेकिन रनटाइम पर सब कुछ फेल हो जाता है। है ना?
\n\nTypeScript में object literal के लिए type definition — Stack Overflow पर सबसे ज्यादा देखे जाने वाले टॉपिक्स में से एक है, जिसके हज़ारों व्यूज़ हैं। और यह कोई संयोग नहीं है। यह जितना सरल दिखता है, उतना ही इसमें गहराई है: interface और type में अंतर, excess properties, optional fields, readonly modifiers, और नया satisfies ऑपरेटर।
2025 में TypeScript बहुत आगे बढ़ चुका है। ऐसी नई फीचर्स आई हैं जो कोड को क्लीनर और सुरक्षित बनाती हैं। लेकिन कई डेवलपर्स अब भी पुराने तरीकों का उपयोग कर रहे हैं। आइए जानते हैं कि आज object literal को सही तरीके से कैसे टाइप किया जाए, ताकि कोड विश्वसनीय, पढ़ने में आसान और आधुनिक हो।
\n\n1. Interface या Type: 2025 में object literal के लिए क्या चुनें?
\n\nयह एक क्लासिक सवाल है जो गरमागरम बहस का कारण बनता है। आइए इसे स्पष्ट करते हैं।
\n\nInterface का उपयोग कब करें
\nInterface ऑब्जेक्ट के आकार (shape) को बताने का सबसे अच्छा तरीका है। यह टाइप इंफ़रेंस के साथ बेहतर काम करता है, एरर मैसेज ज्यादा स्पष्ट देता है, और declaration merging को सपोर्ट करता है।
\n\n// ✅ सही: object literal के लिए interface\ninterface User {\n name: string;\n age: number;\n email?: string; // ऑप्शनल फील्ड\n}\n\nconst user: User = {\n name: "अन्ना",\n age: 28,\n email: "anna@example.com"\n};\n\nType का उपयोग कब करें
\nType-एलियास union-टाइप, intersection-टाइप, tuples और जटिल कंडीशनल टाइप के लिए अपरिहार्य हैं। साधारण ऑब्जेक्ट के लिए भी ये काम करते हैं, लेकिन इनमें सीमाएँ हैं।
\n\n// ✅ सही: union के लिए type\ntype Status = "active" | "inactive" | "pending";\n\n// ऑब्जेक्ट के लिए type भी ठीक है, लेकिन कम एक्सटेंसिबल\ntype UserType = {\n name: string;\n age: number;\n};\n\n2025 का प्रैक्टिकल सुझाव: पब्लिक API और ऑब्जेक्ट के आकार को बताने के लिए interface का उपयोग करें। जटिल कंपोज़िशन, कंडीशनल टाइप और union-टाइप के लिए type का उपयोग करें। यह कोई सख्त नियम नहीं, लेकिन एक अच्छी प्रैक्टिस है।
2. Excess property checks: दुश्मन या दोस्त?
\n\nशुरुआती लोगों की सबसे आम गलतियों में से एक है ऑब्जेक्ट लिटरल में एक अतिरिक्त प्रॉपर्टी डालना। TypeScript एरर देता है, और यह अच्छी बात है।
\n\ninterface Config {\n url: string;\n timeout?: number;\n}\n\n// ❌ एरर: अतिरिक्त प्रॉपर्टी 'retries'\nconst badConfig: Config = {\n url: "https://api.example.com",\n timeout: 5000,\n retries: 3 // Error!\n};\n\nलेकिन एक खामी है: अगर आप ऑब्जेक्ट को एक वेरिएबल के ज़रिए असाइन करते हैं, तो चेकिंग कमजोर हो जाती है। सावधान रहें।
\n\nconst configData = {\n url: "https://api.example.com",\n timeout: 5000,\n retries: 3\n};\n\n// ✅ कोई एरर नहीं (लेकिन यह अप्रत्याशित हो सकता है)\nconst config: Config = configData;\n\n2025 में, टाइप इंफ़रेंस को खोए बिना सख्त चेकिंग के लिए satisfies का उपयोग करें। इसके बारे में अगले सेक्शन में।
3. satisfies ऑपरेटर: 2025 की सबसे बड़ी फीचर
\n\nsatisfies ऑपरेटर TypeScript 4.9 में आया और इसने एक बड़ा बदलाव ला दिया। यह जाँचता है कि एक एक्सप्रेशन का टाइप किसी दिए गए टाइप को पूरा करता है या नहीं, बिना उस टाइप को बदले जो TypeScript ने खुद इंफ़र किया है।
// पुराना तरीका: सटीक टाइप खोना\nconst palette: Record<string, string | string[]> = {\n red: [255, 0, 0],\n green: "#00ff00",\n blue: "#0000ff"\n};\n// palette.red — string | string[] (बुरा)\n\n// नया तरीका: satisfies के साथ\nconst palette = {\n red: [255, 0, 0],\n green: "#00ff00",\n blue: "#0000ff"\n} satisfies Record<string, string | string[]>;\n\n// palette.red — number[] (सटीक टाइप बचा हुआ!)\n// palette.green — string\n// palette.blue — string