TypeScript టీమ్ 6.0 రిలీజ్‌లో ఒక కొత్త కంపైలర్ ఫ్లాగ్‌ను విడుదల చేసింది – --noPropertyAccessFromIndexSignature. దీనిని ఎనేబుల్ చేసినప్పుడు, ఇండెక్స్ సిగ్నేచర్ (index signature) నుండి వచ్చే ప్రాపర్టీలను డాట్-నోటేషన్ (dot-notation) ద్వారా యాక్సెస్ చేయడాన్ని కంపైలర్ నిరాకరిస్తుంది. దీనివల్ల డెవలపర్లు బ్రాకెట్ నోటేషన్ (bracket notation) ఉపయోగించాల్సి ఉంటుంది, తద్వారా undefined విలువలు ప్రొడక్షన్‌లో కాకుండా కంపైల్ టైమ్‌లోనే బయటపడతాయి.

ఈ ఫ్లాగ్ ఎందుకు ముఖ్యమైనది

JavaScriptలో, ఆబ్జెక్ట్‌లు తరచుగా డిక్షనరీలుగా పనిచేస్తాయి, మరియు TypeScript ఇండెక్స్ సిగ్నేచర్ (ఉదాహరణకు Record<string, T>) ఉపయోగించి అటువంటి స్ట్రక్చర్‌లను టైప్ చేయడానికి అనుమతిస్తుంది. ఈ భాష obj.key మరియు obj["key"] రెండింటినీ సమానంగా పరిగణిస్తుంది, కాబట్టి కీ (key) రన్‌టైమ్‌లో మాత్రమే తెలిసినప్పుడు కూడా ఆ ప్రాపర్టీ ఉంటుందని కంపైలర్ భావిస్తుంది. ఈ నిశ్శబ్ద ఊహే (silent assumption) అనేక క్రాష్‌లకు కారణమవుతుంది: obj.missingPropను యాక్సెస్ చేసే కోడ్ కంపైల్ అయినప్పుడు సరిగ్గా ఉంటుంది, రన్ అవుతుంది, కానీ విలువ undefined అయినప్పుడు ఎర్రర్‌ను విసురుతుంది.

డాట్ నోటేషన్ ఒక అంతర్లీన హామీని (implicit guarantee) ఇస్తుంది – ఆ ప్రాపర్టీ ఖచ్చితంగా ఉందని అది రీడర్లకు మరియు టైప్ చెకర్‌కు తెలియజేస్తుంది. దీనికి విరుద్ధంగా, బ్రాకెట్ నోటేషన్ అనిశ్చితిని (uncertainty) సూచిస్తుంది – అంటే కీ లేకపోవచ్చు మరియు ఫలితం undefined కావచ్చు. --noPropertyAccessFromIndexSignature ఈ విజువల్ మరియు సెమాంటిక్ తేడాను అమలు చేస్తుంది, తద్వారా రన్‌టైమ్ ఎర్రర్‌లను కంపైల్-టైమ్ డయాగ్నోస్టిక్స్‌గా మారుస్తుంది.

ఈ ఫ్లాగ్ ఎలా పనిచేస్తుంది

ఈ ఫ్లాగ్‌ను ఆన్ చేసినప్పుడు, ఇండెక్స్ సిగ్నేచర్ ద్వారా డాట్ నోటేషన్‌తో ప్రాపర్టీని యాక్సెస్ చేసే ఏ ఎక్స్‌ప్రెషన్ అయినా ఎర్రర్‌గా గుర్తించబడుతుంది. కోడ్‌ను బ్రాకెట్‌లను ఉపయోగించేలా తిరిగి వ్రాయాలి:

// Before
const name = userData.name;          // OK even if "name" is not in the index

// After enabling the flag
const name = userData["name"];       // Error unless brackets are used

కంపైలర్ అప్పుడు బ్రాకెట్ యాక్సెస్ కోసం ఇప్పటికే ఉపయోగిస్తున్న undefined-హ్యాండ్లింగ్ నియమాలను వర్తింపజేస్తుంది. ఒకవేళ --noUncheckedIndexedAccess కూడా ఎనేబుల్ అయి ఉంటే, userData["name"] యొక్క టైప్ T | undefined అవుతుంది, దీనివల్ల డెవలపర్ తప్పనిసరిగా మిస్సింగ్ కేస్‌ను (missing case) చెక్ చేయాల్సి ఉంటుంది.

ప్రాక్టికల్ మైగ్రేషన్ దశలు

  1. tsconfig.jsonలో ఫ్లాగ్‌ను ఎనేబుల్ చేయండి:

    {
      "compilerOptions": {
        "noPropertyAccessFromIndexSignature": true
      }
    }
    
  2. టైప్ చెకర్‌ను రన్ చేయండి. ఇండెక్స్-సిగ్నేచర్ కీలకు సంబంధించిన అన్ని డాట్-నోటేషన్ యాక్సెస్లు ఎర్రర్‌లుగా కనిపిస్తాయి.

  3. డాట్‌లను బ్రాకెట్‌లతో మార్చండి. ఈ మార్పు మెకానికల్ మాత్రమే; ఇది రన్‌టైమ్ పనితీరుపై ప్రభావం చూపదు.

  4. ఫలితంగా వచ్చే undefined టైప్‌లను పరిష్కరించండి. అవసరమైన చోట nullish coalescing, optional chaining లేదా స్పష్టమైన చెక్‌లను జోడించండి.

  5. గరిష్ట భద్రత కోసం --noUncheckedIndexedAccessతో కలిపి ఉపయోగించడాన్ని పరిశీలించండి. ఇవి రెండూ కలిసి, ఏదైనా డిక్షనరీ-స్టైల్ యాక్సెస్ అనేది ఉండకపోవచ్చు (potentially absent) అని నిర్ధారిస్తాయి.

ఎప్పుడు ఎక్స్‌ప్లిసిట్ ప్రాపర్టీలను ఉంచాలి

ఒక ఫీల్డ్ స్థిరమైన API కాంట్రాక్ట్‌లో భాగమైతే, ఇండెక్స్ సిగ్నేచర్‌పై ఆధారపడకుండా దానిని ఎక్స్‌ప్లిసిట్ ప్రాపర్టీగా ప్రకటించండి. ఎక్స్‌ప్లిసిట్ ప్రాపర్టీలు డాట్ నోటేషన్‌ను అనుమతిస్తూనే, ఆ ఫీల్డ్ ఎల్లప్పుడూ ఉంటుందనే హామీని (టైప్ సిస్టమ్ ఎంతవరకు ధృవీకరించగలదో అంతవరకు) అందిస్తాయి. కీలు ముందుగా తెలియని నిజమైన డైనమిక్ డేటా కోసం మాత్రమే ఇండెక్స్ సిగ్నేచర్లను ఉపయోగించండి.

వ్యతిరేక వాదన: అదనపు వర్బోసిటీ (verbosity)

ఫ్లెక్సిబుల్ ఆబ్జెక్ట్‌లను ఎక్కువగా ఉపయోగించే కోడ్‌బేస్‌లలో, కొన్ని టీమ్‌లకు అదనపు బ్రాకెట్లు ఇబ్బందిగా (noisy) అనిపించవచ్చు. ఈ ఫ్లాగ్ కఠినమైన క్రమశిక్షణను కోరుతుంది, ఇది పాత (legacy) ప్రాజెక్ట్‌ల కోసం పెద్ద ఎత్తున రీఫ్యాక్టరింగ్‌ను అవసరమయ్యేలా చేయవచ్చు. అటువంటి సందర్భాలలో, ఈ ఫ్లాగ్‌ను క్రమంగా ప్రవేశపెట్టవచ్చు, బహుశా కొత్త మాడ్యూల్స్‌కు మాత్రమే పరిమితం చేస్తూ, కాలక్రమేణా మొత్తం కోడ్‌బేస్‌ను ఈ పద్ధతికి అనుగుణంగా మార్చవచ్చు.

తదుపరి ఏం గమనించాలి

ఈ ఫ్లాగ్ TypeScript 6.0లో మరింత కఠినమైన టైప్ సేఫ్టీ వైపు జరుగుతున్న విస్తృత ప్రయత్నంలో భాగం. భవిష్యత్తు రిలీజ్‌లు ఆబ్జెక్ట్ స్ప్రెడ్ (object spread), ఆప్షనల్ చైనింగ్ (optional chaining) లేదా ఇన్ఫర్డ్ any వినియోగం చుట్టూ అదనపు చెక్‌లను పరిచయం చేయవచ్చు. TypeScript రోడ్‌మ్యాప్‌ను గమనిస్తూ ఉండటం వల్ల, డెలివరీ షెడ్యూల్‌లకు అంతరాయం కలగకుండా తదుపరి సేఫ్టీ ఫీచర్లను ఎప్పుడు స్వీకరించాలో టీమ్‌లు నిర్ణయించుకోవడానికి సహాయపడుతుంది.

ముఖ్య అంశం: --noPropertyAccessFromIndexSignatureను ఎనేబుల్ చేయడం వల్ల, “ఈ ప్రాపర్టీ ఖచ్చితంగా ఉంటుంది” మరియు “ఈ ప్రాపర్టీ లేకపోవచ్చు” అనే అంశాల మధ్య తేడా కోడ్‌లో స్పష్టంగా కనిపిస్తుంది, తద్వారా ప్రొడక్షన్‌కు వెళ్లే ముందే ఒక రకమైన బగ్‌లను పట్టుకోవచ్చు. నిశ్శబ్దంగా ఉండే రన్‌టైమ్ ఫెయిలర్‌ను కంపైల్-టైమ్ ఎర్రర్‌గా మార్చడం అనేది చిన్న మార్పు అయినప్పటికీ, ఇది విశ్వసనీయతపై (reliability) గణనీయమైన ప్రభావాన్ని చూపుతుంది.