Timu ya TypeScript imetoa bendera mpya ya kukiandaa (compiler flag) katika toleo la 6.0 – --noPropertyAccessFromIndexSignature. Inapowashwa, kukiandaa (compiler) hukataa ufikiaji wa sifa (properties) kwa kutumia alama ya nukta (dot-notation) zinazotokana na index signature, ikimlazimu mwanandishi wa programu kutumia alama ya mabano (bracket notation) na kuonyesha thamani zinazoweza kuwa undefined wakati wa kukiandaa badala ya wakati wa utendaji (production).

Kwa nini bendera hii ni muhimu

Katika JavaScript, vitu (objects) mara nyingi hutumika kama kamusi (dictionaries), na TypeScript inakuwezesha kuainisha miundo hiyo kwa kutumia index signature, kwa mfano Record<string, T>. Lugha hii inachukulia obj.key na obj["key"] kama zinazoweza kubadilishana, hivyo kukiandaa (compiler) hudhani kuwa sifa hiyo ipo hata wakati funguo (key) inajulikana wakati wa utendaji (runtime). Dhana hiyo ya kimya ndiyo chanzo cha hitilafu (crashes) nyingi: kodi inayofikia obj.missingProp hukamilika vizuri, inafanya kazi, na kisha inafeli kwa sababu thamani yake ni undefined.

Alama ya nukta (dot notation) hubeba ahadi ya ndani – inawaambia wasomaji na kikiandaaji cha aina (type checker) kuwa sifa hiyo ipo hakika. Kwa upande mwingine, alama ya mabano (bracket notation) huashiria kutokuwa na uhakika – funguo inaweza kukosekana, na matokeo yanaweza kuwa undefined. --noPropertyAccessFromIndexSignature inasisitiza utofauti huo wa kuonekana na kimaana, ikigeuza aina fulani ya hitilafu za wakati wa utendaji (runtime errors) kuwa utambuzi wa wakati wa kukiandaa (compile-time diagnostics).

Jinsi bendera hii inavyofanya kazi

Bendera inapowashwa, usemi wowote unaofikia sifa kupitia index signature kwa kutumia alama ya nukta huonyeshwa kama hitilafu. Kodi lazima iandikwe upya ili kutumia mabano:

// 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

Kukiandaa kisha hutumia sheria zilezile za kushughulikia undefined ambazo tayari zinatumika kwa ufikiaji wa mabano. Ikiwa --noUncheckedIndexedAccess pia imewashwa, aina ya userData["name"] inakuwa T | undefined, ikimlazimu mwanandishi wa programu kukagua uwezekano wa kukosekana kwa sifa hiyo.

Hatua za vitendo za uhamiaji

  1. Washa bendera kwenye tsconfig.json:

    {
      "compilerOptions": {
        "noPropertyAccessFromIndexSignature": true
      }
    }
    
  2. Endesha kikiandaaji cha aina (type checker). Ufikiaji wote wa alama ya nukta kwenye funguo za index-signature utatokea kama hitilafu.

  3. Badilisha nukta na mabano. Mabadiliko haya ni ya kimekanika; hayataathiri utendaji wa wakati wa utendaji (runtime performance).

  4. Shughulikia aina za undefined zinazotokana na mabadiliko hayo. Ongeza nullish coalescing, optional chaining, au ukaguzi wa wazi pale inapohitajika.

  5. Fikiria kuunganisha na --noUncheckedIndexedAccess kwa usalama mkubwa zaidi. Kwa pamoja, zinahakikisha kuwa ufikiaji wowote wa mtindo wa kamusi unachukuliwa kama unaweza kukosekana.

Lini uwe na sifa za wazi (explicit properties)

Ikiwa uwanja (field) ni sehemu ya mkataba thabiti wa API, uainishe kama sifa ya wazi badala ya kutegemea index signature. Sifa za wazi zinaendelea kuruhusu alama ya nukta, zikihifadhi ahadi kwamba uwanja huo utakuwepo kila wakati (kadiri mfumo wa aina unavyoweza kuthibitisha). Weka akiba ya index signatures kwa data halisi ya kidinamiki ambapo funguo hazijulikani mapema.

Upande wa pili: ongezeko la maneno mengi (verbosity)

Baadhi ya timu zinaweza kuona mabano ya ziada kuwa yenye usumbufu, hasa katika misingi ya kodi (codebases) inayotumia sana vitu vinavyobadilika (flexible objects). Bendera hii inalazimisha nidhamu kali zaidi ambayo inaweza kuhitaji marekebisho makubwa (refactor) kwa miradi ya zamani. Kwa matukio hayo, bendera inaweza kuanzishwa kidogo kidogo, labda ikizuiliwa kwenye moduli mpya tu, wakati misingi ya kodi pana inafuata mfumo huo kadiri muda unavyopita.

Nini cha kufuatilia baadaye

Bendera hii ni sehemu ya jitihada pana katika TypeScript 6.0 kuelekea usalama mkali wa aina (type safety). Matoleo ya baadaye yanaweza kuleta ukaguzi wa ziada kuhusu object spread, optional chaining, au matumizi ya any yaliyotambuliwa (inferred). Kufuatilia ramani ya TypeScript (TypeScript roadmap) kutasaidia timu kuamua wakati wa kupokea seti inayofuata ya vipengele vya usalama bila kuvuruga ratiba za utoaji.

Muhtasari: Kuwasha --noPropertyAccessFromIndexSignature kunafanya utofauti kati ya “sifa hii imehakikishwa” na “sifa hii inaweza kukosekana” uwe wazi katika kodi, hivyo kukamata aina nzima ya hitilafu kabla hazijafika kwenye utendaji (production). Kugeuza hitilafu ya kimya ya wakati wa utendaji kuwa hitilafu ya wakati wa kukiandaa ni mabadiliko madogo yenye athari kubwa sana kwenye uaminifu wa programu.