आप समझते हैं कि strict mode वास्तव में क्या सक्षम करता है और किसी मौजूदा प्रोजेक्ट में इसके द्वारा उजागर की गई विशिष्ट त्रुटियों को संभालना जानते हैं।
इस पाठ को Kodokon में खोलें"strict": true एक विकल्प नहीं बल्कि एक समुच्चय (aggregate) है जो जाँचों के एक पूरे परिवार को सक्षम करता है: strictNullChecks, noImplicitAny, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, noImplicitThis, useUnknownInCatchVariables, और alwaysStrict। हर नया TypeScript संस्करण और जोड़ सकता है: strict सक्षम करना आपको भविष्य की जाँचों के लिए सदस्यता दिला देता है। हर flag को अब भी अलग-अलग अक्षम किया जा सकता है, जो किसी मौजूदा codebase पर क्रमिक migration की अनुमति देता है।
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"noFallthroughCasesInSwitch": true,
"exactOptionalPropertyTypes": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true
}
}सबसे अधिक प्रभाव वाले दो flags हैं strictNullChecks और noImplicitAny। पहला सभी टाइप्स से null और undefined को हटा देता है: हर संभावित रूप से अनुपस्थित मान को T | undefined घोषित करना होता है और उपयोग से पहले संभालना होता है। दूसरा किसी बिना-annotate किए parameter को any पर वापस आने से मना करता है। मिलकर, वे JavaScript बग्स के दो बड़े परिवारों को समाप्त कर देते हैं: "cannot read property of undefined" और अनियंत्रित मानों का प्रसार। useUnknownInCatchVariables इस चित्र को पूरा करता है: किसी catch में variable unknown होता है, क्योंकि JavaScript आपको कुछ भी throw करने देता है।
function findPort(
env: Record<string, string | undefined>
): number {
const raw = env["PORT"];
if (raw === undefined) {
return 3000;
}
return Number.parseInt(raw, 10);
}
declare function riskyOperation(): void;
try {
riskyOperation();
} catch (err) {
const message =
err instanceof Error ? err.message : String(err);
console.error(message);
}सामान्य migration त्रुटियाँ, और उनके वास्तविक उपचार। "Object is possibly undefined": non-null assertion ! के बजाय narrowing (if), optional chaining ?., या एक ?? default को प्राथमिकता दें, क्योंकि ! तो बस crash को कहीं और खिसका देता है। "Property has no initializer" (strictPropertyInitialization): फ़ील्ड पर ! लगाने के बजाय constructor में initialize करें। ?? बनाम || के जाल से भी सावधान रहें: port || 3000, 0 और "" को भी बदल देता है, जबकि port ?? 3000 केवल null और undefined को बदलता है।
interface Settings { retries?: number }
function resolveRetries(s: Settings): number {
const bad = s.retries || 3;
const good = s.retries ?? 3;
return good;
}
const names = ["Ada", "Linus"];
const first = names[0];
const upper = first?.toUpperCase() ?? "N/A";समुच्चय से परे, तीन विकल्प टीम की चर्चा के हक़दार हैं। noUncheckedIndexedAccess हर indexed access (arr[i], dict[key]) में undefined जोड़ देता है: अधिक सुरक्षित, लेकिन array-हेरफेर वाले कोड में शब्दबहुल (verbose) - कई टीमें इसे केवल नए प्रोजेक्ट्स पर अपनाती हैं। exactOptionalPropertyTypes, "property अनुपस्थित" को "property undefined पर सेट" से अलग करता है, जो patches के लिए महत्वपूर्ण है। skipLibCheck आपकी dependencies की .d.ts फ़ाइलों की जाँच छोड़ देता है: build समय और libraries के बीच टकराव का पता लगाने के बीच एक सुविचारित समझौता।
"strict": true ठीक-ठीक क्या करता है?retries?: number को 0 पर सेट किए जाने पर, retries || 3 और retries ?? 3 के बीच क्या अंतर है?// @ts-ignore की तुलना में // @ts-expect-error को क्यों प्राथमिकता दें?