Tim TypeScript telah merilis flag compiler baru pada rilis 6.0 – --noPropertyAccessFromIndexSignature. Saat diaktifkan, compiler akan menolak akses notasi titik (dot-notation) ke properti yang berasal dari index signature, sehingga memaksa pengembang untuk menggunakan notasi kurung siku (bracket notation) dan memunculkan potensi nilai undefined pada saat kompilasi (compile time) alih-alih di produksi.

Mengapa flag ini penting

Dalam JavaScript, objek sering kali berfungsi sebagai kamus (dictionary), dan TypeScript memungkinkan Anda memberikan tipe pada struktur tersebut dengan index signature, misalnya Record<string, T>. Bahasa ini memperlakukan obj.key dan obj["key"] sebagai hal yang dapat saling menggantikan, sehingga compiler berasumsi bahwa properti tersebut ada meskipun kuncinya (key) baru diketahui saat runtime. Asumsi diam-diam tersebut menjadi sumber banyak crash: kode yang mengakses obj.missingProp dapat dikompilasi dengan baik, berjalan, lalu kemudian error karena nilainya adalah undefined.

Notasi titik membawa jaminan implisit – ia memberi tahu pembaca dan type checker bahwa properti tersebut pasti ada. Sebaliknya, notasi kurung siku menandakan ketidakpastian – kuncinya mungkin tidak ada, dan hasilnya bisa berupa undefined. --noPropertyAccessFromIndexSignature menegakkan perbedaan visual dan semantik tersebut, mengubah sekelompok error runtime menjadi diagnostik pada saat kompilasi.

Cara kerja flag ini

Saat flag diaktifkan, ekspresi apa pun yang mengakses properti melalui index signature dengan notasi titik akan ditandai sebagai error. Kode harus ditulis ulang menggunakan kurung siku:

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

Compiler kemudian menerapkan aturan penanganan undefined yang sama seperti yang sudah digunakan untuk akses kurung siku. Jika --noUncheckedIndexedAccess juga diaktifkan, tipe dari userData["name"] menjadi T | undefined, yang memaksa pengembang untuk memeriksa kasus jika data tidak ditemukan.

Langkah-langkah migrasi praktis

  1. Aktifkan flag di tsconfig.json:

    {
      "compilerOptions": {
        "noPropertyAccessFromIndexSignature": true
      }
    }
    
  2. Jalankan type checker. Semua akses notasi titik ke kunci index-signature akan muncul sebagai error.

  3. Ganti titik dengan kurung siku. Perubahan ini bersifat mekanis; tidak memengaruhi performa runtime.

  4. Tangani tipe undefined yang dihasilkan. Tambahkan nullish coalescing, optional chaining, atau pemeriksaan eksplisit jika diperlukan.

  5. Pertimbangkan untuk memasangkannya dengan --noUncheckedIndexedAccess untuk jaring pengaman terkuat. Keduanya memastikan bahwa setiap akses gaya kamus (dictionary-style) diperlakukan sebagai sesuatu yang berpotensi tidak ada.

Kapan harus menggunakan properti eksplisit

Jika sebuah field adalah bagian dari kontrak API yang stabil, deklarasikan sebagai properti eksplisit daripada mengandalkan index signature. Properti eksplisit tetap mengizinkan notasi titik, menjaga jaminan bahwa field tersebut akan selalu ada (sejauh sistem tipe dapat memverifikasi). Simpan index signature untuk data yang benar-benar dinamis di mana kunci-kuncinya tidak diketahui sebelumnya.

Sisi lain: tambahan verbositas

Beberapa tim mungkin merasa penggunaan kurung siku tambahan terasa berlebihan (noisy), terutama pada codebase yang banyak menggunakan objek fleksibel. Flag ini memaksakan disiplin yang lebih ketat yang dapat memerlukan refaktor besar untuk proyek lama (legacy). Untuk kasus-kasus tersebut, flag dapat diperkenalkan secara bertahap, mungkin dibatasi pada modul baru saja, sementara codebase yang lebih luas mengadopsi pola tersebut seiring berjalannya waktu.

Apa yang perlu diperhatikan selanjutnya

Flag ini adalah bagian dari dorongan yang lebih luas di TypeScript 6.0 menuju keamanan tipe (type safety) yang lebih ketat. Rilis mendatang mungkin memperkenalkan pemeriksaan tambahan seputar object spread, optional chaining, atau penggunaan any yang terinferensi. Memantau roadmap TypeScript akan membantu tim memutuskan kapan harus mengadopsi rangkaian fitur keamanan berikutnya tanpa mengganggu jadwal pengiriman (delivery schedules).

Kesimpulan: Mengaktifkan --noPropertyAccessFromIndexSignature membuat perbedaan antara “properti ini dijamin ada” dan “properti ini mungkin tidak ada” menjadi eksplisit dalam kode, sehingga menangkap seluruh kelas bug sebelum mencapai produksi. Mengubah kegagalan runtime yang diam-diam menjadi error pada saat kompilasi adalah perubahan kecil dengan dampak yang sangat besar terhadap keandalan.