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
Aktifkan flag di
tsconfig.json:{ "compilerOptions": { "noPropertyAccessFromIndexSignature": true } }Jalankan type checker. Semua akses notasi titik ke kunci index-signature akan muncul sebagai error.
Ganti titik dengan kurung siku. Perubahan ini bersifat mekanis; tidak memengaruhi performa runtime.
Tangani tipe
undefinedyang dihasilkan. Tambahkan nullish coalescing, optional chaining, atau pemeriksaan eksplisit jika diperlukan.Pertimbangkan untuk memasangkannya dengan
--noUncheckedIndexedAccessuntuk 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.
