Kodokon kodokon.com

Strict tsconfig: मुख्य विकल्प और सामान्य त्रुटियाँ

आप समझते हैं कि strict mode वास्तव में क्या सक्षम करता है और किसी मौजूदा प्रोजेक्ट में इसके द्वारा उजागर की गई विशिष्ट त्रुटियों को संभालना जानते हैं।

11 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

"strict": true एक विकल्प नहीं बल्कि एक समुच्चय (aggregate) है जो जाँचों के एक पूरे परिवार को सक्षम करता है: strictNullChecks, noImplicitAny, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, noImplicitThis, useUnknownInCatchVariables, और alwaysStrict। हर नया TypeScript संस्करण और जोड़ सकता है: strict सक्षम करना आपको भविष्य की जाँचों के लिए सदस्यता दिला देता है। हर flag को अब भी अलग-अलग अक्षम किया जा सकता है, जो किसी मौजूदा codebase पर क्रमिक migration की अनुमति देता है।

JSON
{
  "compilerOptions": {
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,
    "noFallthroughCasesInSwitch": true,
    "exactOptionalPropertyTypes": true,
    "verbatimModuleSyntax": true,
    "skipLibCheck": true
  }
}
समुच्चय के बाहर के विकल्पों के साथ विस्तारित एक strict आधार-रेखा (JSON फ़ाइल)।

सबसे अधिक प्रभाव वाले दो flags हैं strictNullChecks और noImplicitAny। पहला सभी टाइप्स से null और undefined को हटा देता है: हर संभावित रूप से अनुपस्थित मान को T | undefined घोषित करना होता है और उपयोग से पहले संभालना होता है। दूसरा किसी बिना-annotate किए parameter को any पर वापस आने से मना करता है। मिलकर, वे JavaScript बग्स के दो बड़े परिवारों को समाप्त कर देते हैं: "cannot read property of undefined" और अनियंत्रित मानों का प्रसार। useUnknownInCatchVariables इस चित्र को पूरा करता है: किसी catch में variable unknown होता है, क्योंकि JavaScript आपको कुछ भी throw करने देता है।

TYPESCRIPT
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);
}
दो strict patterns: अनुपस्थिति संभाली गई, catch को unknown के रूप में।

सामान्य 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 को बदलता है।

TYPESCRIPT
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";
retries: 0 पर bad = 3 देता है लेकिन good = 0; इसके बाद index access जाँचा जाता है।

समुच्चय से परे, तीन विकल्प टीम की चर्चा के हक़दार हैं। noUncheckedIndexedAccess हर indexed access (arr[i], dict[key]) में undefined जोड़ देता है: अधिक सुरक्षित, लेकिन array-हेरफेर वाले कोड में शब्दबहुल (verbose) - कई टीमें इसे केवल नए प्रोजेक्ट्स पर अपनाती हैं। exactOptionalPropertyTypes, "property अनुपस्थित" को "property undefined पर सेट" से अलग करता है, जो patches के लिए महत्वपूर्ण है। skipLibCheck आपकी dependencies की .d.ts फ़ाइलों की जाँच छोड़ देता है: build समय और libraries के बीच टकराव का पता लगाने के बीच एक सुविचारित समझौता।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. tsconfig.json में "strict": true ठीक-ठीक क्या करता है?
    • यह केवल strictNullChecks विकल्प को सक्षम करता है
    • यह strict flags के एक समूह को सक्षम करता है, जिनमें से हर एक को अब भी अलग-अलग अक्षम किया जा सकता है
    • यह any टाइप के किसी भी उपयोग को, यहाँ तक कि स्पष्ट को भी, निषिद्ध करता है
    • यह ES5 mode में compilation को बाध्य करता है
  2. retries?: number को 0 पर सेट किए जाने पर, retries || 3 और retries ?? 3 के बीच क्या अंतर है?
    • कोई नहीं, दोनों 0 लौटाते हैं
    • || 3 लौटाता है क्योंकि 0 falsy है; ?? 0 लौटाता है क्योंकि यह केवल null और undefined को बदलता है
    • ?? 3 लौटाता है क्योंकि 0 को अनुपस्थित माना जाता है
  3. टाइपिंग ऋण को चिह्नित करने के लिए // @ts-ignore की तुलना में // @ts-expect-error को क्यों प्राथमिकता दें?
    • @ts-expect-error एक साथ कई त्रुटियों को दबा देता है
    • @ts-ignore strict mode में काम नहीं करता
    • @ts-expect-error, समस्या ठीक हो जाने पर एक error बन जाता है, इसलिए ऋण स्वयं की सफ़ाई कर देता है