यदि आपने कभी TypeScript monorepo में दो-लाइन का bugfix पुश किया है और अपने build pipeline को दस मिनट तक type checking में उलझा हुआ देखा है, तो आप समस्या को पहले से ही समझ चुके हैं। देरी bundling की वजह से नहीं है। यह minification की वजह से भी नहीं है। यह वह क्षण है जब TypeScript आपकी declaration files लिखने की कोशिश करता है। एक भी .d.ts file emit करने से पहले, compiler को पूरा type graph resolve करना पड़ता है। यह imports को खंगालता है, generics का मूल्यांकन करता है, और उन return types का अनुमान लगाता है जो शायद तीन dependency layers की गहराई में हों। वह एक फ़ाइल जिसे आपने बदला है, वह दूसरी फ़ाइल को प्रभावित करती है, जो तीसरी को प्रभावित करती है, और अचानक compiler केवल यह बताने के लिए कि आपका function क्या return करता है, पूरे repository में खोजबीन करने लगता है।
TypeScript 6.0 इस आदत को तोड़ने के लिए isolatedDeclarations पेश करता है।
असली बाधा (The Real Bottleneck)
Declaration files आपके कोड का public contract होती हैं। जब कोई अन्य developer आपके package को import करता है, तो TypeScript .d.ts files को पढ़ता है, source को नहीं। उन files को सही ढंग से generate करने का मतलब है कि compiler type checker को skip नहीं कर सकता। output की एक भी line लिखने से पहले उसे हर shape, हर union, और हर inferred return type का पता होना चाहिए।
पचास files वाले छोटे project में, यह तुरंत हो जाता है। हज़ारों modules वाले बड़े monorepo में, यह एक serialized nightmare बन जाता है। किसी core package में एक utility type बदलें, और compiler हर consumer को फिर से जाँचता है ताकि यह verify किया जा सके कि inferred types अभी भी सही हैं। Build time केवल file count के साथ नहीं, बल्कि dependency depth के साथ बढ़ता है। एक मामूली refactor भी full-graph recomputation को trigger कर सकता है। टीमें अक्सर इसे अपरिहार्य मानकर स्वीकार कर लेती हैं। ऐसा नहीं है।
isolatedDeclarations कैसे काम करता है
नया flag आपके और compiler के बीच के contract को बदल देता है। TypeScript से आपके exports के types का अनुमान (infer) लगाने के लिए कहने के बजाय, आप उन्हें स्वयं annotate करते हैं। यह एक छोटा सा बदलाव global knowledge की आवश्यकता को समाप्त कर देता है। अब compiler को अपने module के लिए declarations emit करने के लिए आपकी dependencies का विश्लेषण करने की आवश्यकता नहीं है। यह केवल अपने सामने मौजूद syntax को देखता है।
इसका मतलब है कि प्रत्येक file स्वतंत्र रूप से, parallel में अपना .d.ts output emit कर सकती है। declaration generation शुरू करने से पहले build tool को पूरा type graph बनाने की आवश्यकता नहीं है। esbuild और swc जैसे tools, जो पहले type checker की कमी के कारण .d.ts emit करने से बचते थे, अब near-transpilation speeds पर declarations generate कर सकते हैं। वे सीधे source से explicit annotations पढ़ते हैं और किसी भी type equations को हल किए बिना संबंधित type definitions लिख देते हैं।
पहले, declaration emit पर tsc का एकाधिकार था क्योंकि केवल official compiler के पास ही .d.ts files बनाने के लिए आवश्यक type information होती थी। Fast transpilers types को हटा (strip) सकते थे या syntax को बदल सकते थे, लेकिन वे type definitions generate नहीं कर सकते थे। isolatedDeclarations के साथ, पूरे ecosystem के लिए declaration workflows को संभालने के द्वार खुल जाते हैं। यह transformation तार्किक (logical) के बजाय यांत्रिक (mechanical) हो जाता है। यही वह अंतर है जो दस मिनट के इंतज़ार को सेकंडों में बदल देता है।
ट्रेडऑफ (The Tradeoff): Explicit ही नया Default है
गति के साथ एक सीधी कीमत आती है। प्रत्येक exported function, class, और variable में एक explicit type annotation होना चाहिए। TypeScript आपके लिए public API का अनुमान लगाने से इनकार कर देगा।
एक साधारण utility पर विचार करें:
export function getUser(id: number) {
return fetchUser(id);
}
isolatedDeclarations सक्षम होने पर, इसमें error आएगा। compiler fetchUser का निरीक्षण किए बिना उसके return type को नहीं जान सकता, और इस flag के तहत
