TypeScript 7 पर स्विच करने से पहले ध्यान देने योग्य संगतता (compatibility) समस्याएं और CI ऑप्टिमाइज़ेशन
29 जुलाई 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
TypeScript 7 आ गया है, जिसे कंपाइलर को Go में दोबारा लिखकर बनाया गया है। यह खबर सुनकर कि टाइप चेकिंग की गति 12 गुना तक तेज हो गई है, बड़े पैमाने पर मोनorepo चलाने वाली टीमें तुरंत इसमें स्विच करना चाहेंगी। वास्तव में, Vanta और VS Code इंजीनियरिंग टीमों ने बताया है कि उन्होंने अपने CI पाइपलाइन के बिल्ड समय को 80% से अधिक कम कर लिया है।
हालांकि, बिना सोचे-समझे इसे लागू करने पर पूरा CI क्रैश हो सकता है। चूंकि इसे नेटिव बाइनरी में बदल दिया गया है, इसलिए मौजूदा स्टैटिक एनालिसिस API के सपोर्ट को बाद के वर्जन्स के लिए टाल दिया गया है। @typescript-eslint या ts-morph जैसे टूल्स, जो require('typescript') के जरिए इंटरनल API को एक्सेस करते थे, एक साथ काम करना बंद कर देते हैं। परफॉर्मेंस आकर्षक है, लेकिन टूलचेन का टूटना एक अलग समस्या है। डिप्लॉयमेंट रुकने से बचने और गति का लाभ उठाने के लिए कुछ वर्कअराउंड (उपााय) अपनाने की आवश्यकता है।
TypeScript 7.0 की tsc बाइनरी Node.js इंटरनल मॉड्यूल कॉल्स को पूरी तरह से ब्लॉक कर देती है। जो पैकेजेस पहले की तरह JS वातावरण में इम्पोर्ट होकर इस्तेमाल होते थे, वे बिल्ड के समय तुरंत एरर देने लगते हैं। बिना तैयारी के केवल वर्जन अपडेट करने से पूरी CI पाइपलाइन बाधित हो जाएगी।
पाइपलाइन के सबसे ऊपर एक डायग्नोस्टिक स्क्रिप्ट रखना सुरक्षित रहता है। यह तरीका वर्कस्पेस के भीतर के सभी package.json और tsconfig.json को स्कैन करता है ताकि उन ऑप्शन्स या पैकेजेस का पता लगाया जा सके जिन्हें TS 7 अस्वीकार करता है। यदि ignoreDeprecations या target: es5 जैसी पुरानी सेटिंग्स बची रहती हैं, तो यह तुरंत एरर देता है और प्रोसेस को रोक देता है।
`javascript
// scripts/check-ts7-compatibility.mjs
import fs from 'node:fs';
import { globSync } from 'glob';
const INCOMPATIBLE_DEPS = [
'ts-morph',
'ts-node',
'@babel/plugin-transform-typescript',
'typescript-eslint',
'@typescript-eslint/parser'
];
const DEPRECATED_TSCONFIG_OPTIONS = ['target:es5', 'moduleResolution:node', 'baseUrl', 'ignoreDeprecations'];
function runDiagnostics() {
console.log('TypeScript 7 호환성 사전 진단 시작...');
let hasError = false;
const packageFiles = globSync('/package.json', { ignore: '/node_modules/' });
for (const file of packageFiles) {
const content = JSON.parse(fs.readFileSync(file, 'utf8'));
const allDeps = { ...content.dependencies, ...content.devDependencies };
for (const dep of INCOMPATIBLE_DEPS) {
if (allDeps[dep]) {
console.warn([의존성 경고] ${file}: '${dep}' 패키지는 TS7 네이티브 API와 호환되지 않습니다.);
hasError = true;
}
}
}
const tsconfigFiles = globSync('/tsconfig*.json', { ignore: '/node_modules/' });
for (const file of tsconfigFiles) {
const rawContent = fs.readFileSync(file, 'utf8');
for (const opt of DEPRECATED_TSCONFIG_OPTIONS) {
if (rawContent.includes(opt)) {
console.error([설정 오류] ${file}: 무효화된 옵션 발견 -> '${opt}');
hasError = true;
}
}
}
if (hasError) process.exit(1);
}
runDiagnostics();
`
कस्टम AST ट्रांसफॉर्मर्स जो ts.createProgram() या ts.transform() पर निर्भर हैं, वे भी काम नहीं करेंगे। TS 7.0 बाहरी JS प्लगइन इंजेक्शन स्वीकार नहीं करता है। इस तरह के लॉजिक को SWC या Babel जैसे Rust/C++ बाइंडिंग मॉड्यूल में बदलना होगा, या फिर कंप्लीशन चरण से बाहर हटाना होगा।
| कंपाइलर विकल्प | TypeScript 6.0 व्यवहार | TypeScript 7.0 व्यवहार | प्रतिक्रिया का तरीका |
|---|---|---|---|
target |
es5 उपयोग करने पर चेतावनी |
Hard Error (संकलन रुक जाता है) | es2022 या उससे ऊपर बदलें |
moduleResolution |
node सेटिंग की अनुमति |
Hard Error | bundler या node16 में बदलें |
baseUrl |
अकेले उपयोग की अनुमति | Hard Error | compilerOptions.paths के अकेले उपयोग पर स्विच करें |
ignoreDeprecations |
चेतावनी नजरअंदाज होती है | विकल्प अमान्य और एरर | इस सेटिंग को पूरी तरह हटाएं |
strict |
डिफ़ॉल्ट मान false |
डिफ़ॉल्ट मान true |
tsconfig.json में स्पष्ट मान सेट करें |
TypeScript 7 Go के थ्रेडिंग मॉडल का लाभ उठाता है। यह टाइप चेकिंग को समानांतर रूप से प्रोसेस करने के लिए --checkers और प्रोजेक्ट रेफरेंस बिल्ड को नियंत्रित करने के लिए --builders विकल्प प्रदान करता है। Slack इंजीनियरिंग टीम ने इन विकल्पों को मिलाकर टाइप चेकिंग के समय को 20 मिनट से घटाकर 4.5 मिनट कर दिया। हालांकि, यदि कोर की संख्या के हिसाब से बहुत अधिक थ्रेड्स ले लिए जाएं, तो CPU कॉनтекст स्विचिंग ओवरहेड बढ़ जाता है और OOM (Out of Memory) की वजह से बिल्ड क्रैश हो जाता है।
रनर स्पेक के अनुसार निम्नलिखित सूत्र (formula) का उपयोग करके थ्रेड्स सेट करना बेहतर है। यदि वर्चुअल मशीन के आवंटित कोर की संख्या , कुल मेमोरी , OS आरक्षित मेमोरी (), और प्रति वर्कर औसत मेमोरी खपत () है, तो सिंगल प्रोजेक्ट के लिए इष्टतम थ्रेड्स की संख्या इस प्रकार होगी:
N_{checkers} = minleft( C_{vCPU}, leftlfloor rac{M_{total} - M_{OS}}{M_{worker}} ight floor ight)कुल थ्रेड्स का योग से अधिक नहीं होना चाहिए। उदाहरण के लिए, यदि 8 vCPU / 16GB रनर का वातावरण है, तो --checkers 4, --builders 2 सेटिंग उपयुक्त है।
`yaml
name: Monorepo Parallel Typecheck
on:
push:
branches: [main]
jobs:
typecheck:
runs-on: ubuntu-latest-8-core
steps:
- name: Checkout Codebase
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Purge Legacy TS 6.0 Cache
run: find . -name "*.tsbuildinfo" -not -path "*/node_modules/*" -delete
- name: Execute TS 7 Parallel Check
run: npx tsc --build --checkers 4 --builders 2 --verbose
`
ध्यान देने योग्य एक बात है। TS 7 का इंक्रीमेंटल कंपाइलेशन इंजन पुराने TS 6 की .tsbuildinfo कैश फाइल के फॉर्मेट से मेल नहीं खाता है। यदि बिल्ड से पहले find . -name "*.tsbuildinfo" -delete का उपयोग करके पुराने वर्जन के कैश को नहीं हटाया जाता है, तो सेगमेंटेशन एरर आ जाएगा।
एडिटर के लिए लैंग्वेज सर्वर को भी Go बाइनरी आधारित LSP में बदल दिया गया है। AWS CodeBuild के परीक्षण परिणामों के अनुसार, बड़े पैमाने पर मोनorepo में फाइल खोलने पर पहला टाइप एरर आने में लगने वाला समय 17.5 सेकंड से घटकर 1.3 सेकंड हो गया है।
टीम के सदस्यों के VS Code वातावरण को एक समान रखने के लिए, मोनorepo के रूट में .vscode/settings.json में निम्नलिखित सेटिंग्स जोड़ी जा सकती हैं।
`json
{
"typescript.tsdk": "node_modules/typescript/lib",
"js/ts.experimental.useTsgo": true,
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.preferences.preferTypeOnlyAutoImports": true,
"files.associations": {
"*.tsbuildinfo": "json"
}
}
`
कभी-कभी Vue या Svelte जैसे टेम्पलेट भाषा प्लगइन्स के साथ संघर्ष (conflict) के कारण पार्सिंग रुक जाती है। ऐसे मामलों में, कमांड पैलेट (Ctrl+Shift+P) में TypeScript: Select TypeScript Version... दबाकर पुराने TS 6.0 इंजन पर वापस जाकर काम किया जा सकता है।
यदि प्रोजेक्ट में पुरानी पैकेजेस जुड़ी हुई हैं और आप तुरंत ESLint को TS 7 वातावरण में नहीं ले जा पा रहे हैं, तो आप दो कंपाइलर्स के साथ एक ड्यूल-इंजन कॉन्फ़िगरेशन का उपयोग करके काम चला सकते हैं। इसमें स्टैटिक एनालिसिस टूल से TS 6 API को जोड़ा जाता है, और वास्तविक टाइप चेकिंग तथा बिल्ड का काम TS 7 नेटिव बाइनरी को सौंप दिया जाता है।
package.json में पैकेज एलियास (Alias) निर्दिष्ट करके दोनों कंपाइलर्स को एक साथ इंस्टॉल करें।
`json
{
"name": "monorepo-root",
"private": true,
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.2",
"@typescript/native": "npm:typescript@^7.0.2",
"eslint": “^9.0.0",
"typescript-eslint": “^8.0.0"
},
"scripts": {
"typecheck": "ts-native --build",
"typecheck:legacy": "tsc6 --noEmit",
"lint": "eslint ."
}
}
`
इस स्थिति में CI में शैडो बिल्ड (Shadow Build) स्क्रिप्ट संलग्न करना सुरक्षित रहता है। आप पुराने TS 6 के डायग्नोस्टिक परिणामों और TS 7 के डायग्नोस्टिक परिणामों की diff से तुलना कर सकते हैं ताकि यह निगरानी की जा सके कि टेम्पलेट लिटरल टाइप या कंडीशनल टाइप इन्फेरेंस में परिणाम भिन्न आते हैं या नहीं।
`bash
#!/usr/bin/env bash
set -e
echo "=== 1. 기존 TS 6.0 컴파일러 진단 출력 생성 ==="
npx tsc6 --noEmit --pretty false > ./ts6-baseline.log 2>&1 || true
echo "=== 2. 신규 TS 7.0 네이티브 컴파일러 진단 출력 생성 ==="
npx --package @typescript/native tsc --noEmit --pretty false > ./ts7-output.log 2>&1 || true
echo "=== 3. 진단 결과 Diff 대조 검증 ==="
DIFF_RESULT=$(diff ./ts6-baseline.log ./ts7-output.log || true)
if [ -z "DIFF_RESULT"
exit 0
fi
`
जब तक टूलचेन संगतता की समस्या हल नहीं हो जाती, तब तक लिंट और टाइपचेक की भूमिकाओं को अलग करके संचालन करना व्यावहारिक है। प्री-डायग्नोस्टिक स्क्रिप्ट के साथ समस्या पैदा करने वाले विकल्पों को व्यवस्थित करके और CI इन्फ्रास्ट्रक्चर स्पेक के अनुसार थ्रेड्स को समायोजित करके, आप डिप्लॉयमेंट पाइपलाइन को रोके बिना गति में सुधार का लाभ उठा सकते हैं।