Skip to content

TypeScript टाइप नैरोइंग समझाया गया

वे तरीके जिनसे TypeScript किसी ब्रांच के अंदर एक टाइप को सीमित करता है, तकनीक के अनुसार समूहबद्ध: इनबिल्ट गार्ड, कस्टम प्रेडिकेट, असर्शन फ़ंक्शन, डिस्क्रिमिनेटेड यूनियन, इक्वलिटी और ट्रुथीनेस फ़्लो, और एलायस्ड व डिफर्ड नैरोइंग। हर पंक्ति तकनीक को एक-पंक्ति उदाहरण के साथ जोड़ती है।

नैरोइंग का मतलब है TypeScript किसी चौड़े टाइप को कोड ब्रांच के अंदर ज़्यादा सटीक टाइप में बदल देता है, ताकि वह यह सिद्ध कर सके कि प्रॉपर्टी तक पहुँचना सुरक्षित है। हर जाँच (typeof, in, कोई प्रेडिकेट, कोई डिस्क्रिमिनेटर) कंपाइलर को बताती है: यहाँ से आगे वैल्यू ज़्यादा विशिष्ट है। नीचे दी गई तकनीकें काम का सेट हैं।

संदर्भ तालिका · 23 प्रविष्टियाँ
23 of 23 rows
इनबिल्ट गार्ड
प्रिमिटिव को सीमित करता है: string, number, boolean आदि।if (typeof x === 'string') x.toUpperCase()
किसी क्लास या कंस्ट्रक्टेबल इंस्टेंस तक सीमित करता है।if (e instanceof Error) e.message
वैल्यू पर कोई प्रॉपर्टी मौजूद है, यह जाँचकर सीमित करता है।if ('id' in obj) obj.id
किसी भी वैल्यू को ऐरे में सीमित करता है; यूनियन को उसके ऐरे मेंबर तक सीमित करता है।if (Array.isArray(x)) x.map(f)
कस्टम गार्ड
ऐसा प्रेडिकेट फ़ंक्शन जिसका रिटर्न आर्ग्युमेंट को सीमित करता है।function isUser(x): x is User { return !!x.id }
प्रेडिकेट टाइपों के यूनियन तक सीमित कर सकता है, केवल एक टाइप तक नहीं।function isKey(x): x is string | number
इंटरसेक्शन प्रेडिकेट इनपुट टाइप बनाए रखता है और उसमें फ़ील्ड जोड़ता है।function hasId(x): x is x & { id: string }
ऐसा असर्शन फ़ंक्शन जो थ्रो कर देता है यदि x वह टाइप न हो।function assertUser(x): asserts x is User
डिस्क्रिमिनेटेड यूनियन
साझा लिटरल फ़ील्ड के ज़रिए switch या if से यूनियन को सीमित करता है।type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
हर case यूनियन के एक मेंबर तक सीमित करता है।switch (u.kind) { case 'a': u.a }
बिना टैग वाली यूनियन को सीमित करता है जब कोई प्रॉपर्टी सिर्फ़ एक मेंबर पर हो।if ('b' in u) u.b
हर case एक कंडीशन है; मैच होने वाला case वैल्यू को सीमित करता है।switch (true) { case typeof x === 'string': }
डिफ़ॉल्ट case वैल्यू को never को असाइन करता है, जिससे सिद्ध होता है कि switch संपूर्ण है।default: { const x: never = u }
इक्वलिटी और फ़्लो
इक्वलिटी जाँच के बाद null और undefined हटा देता है।if (x === null) return; x.toFixed()
falsy वैल्यू (0, '', null, undefined, NaN) हटा देता है।if (!x) return; // x is defined here
truthy चेन की गई प्रॉपर्टी यह सिद्ध करती है कि बेस वैल्यू मौजूद है।if (user?.active) user.name
non-null असर्शन बिना जाँच के null और undefined हटा देता है।x!.toFixed(2)
डेफ़िनिट असाइनमेंट: घोषित करता है कि x पढ़े जाने से पहले असाइन होता है।let name!: string; init()
नैरोइंग ब्रांच के अंदर और early return के बाद लागू रहता है।if (!arr) return; arr.map(...)
एलायस्ड और डिफर्ड
const बूलियन जिसमें कोई जाँच हो, जहाँ भी परखा जाए वहीं सीमित करता है।const isStr = typeof x === 'string'; if (isStr) …
const वेरिएबल अपना नैरोइंग उन closures में बनाए रखता है जो उसे कैप्चर करते हैं।const s = get(); if (s) use(() => s.length)
TS 5.4 से, let या पैरामीटर अपने अंतिम असाइनमेंट के बाद closures में नैरोइंग बनाए रखता है।let n: string | null = get(); if (n) use(() => n.length)
unknown का उपयोग तब तक नहीं हो सकता जब तक कोई गार्ड उसे किसी वास्तविक टाइप तक सीमित न कर दे।if (typeof u === 'string') u.length