TypeScript vs JavaScript: Kenapa Saya Akhirnya Total Pindah

Selama beberapa tahun saya nulis JavaScript polos dengan alasan klasik: “lebih cepat, nggak perlu setup ribet”. Sekarang, hampir semua proyek baru saya mulai langsung pakai TypeScript, dan titik baliknya sebenernya satu kejadian spesifik, bukan keputusan bertahap yang saya rencanain rapi.
Kejadiannya di proyek client sekitar dua tahun lalu — dashboard internal yang saya bangun pakai JavaScript polos karena “kan proyeknya kecil, nggak perlu TypeScript”. Tiga bulan kemudian, ada perubahan kecil di response API — satu field yang tadinya string diubah jadi string | null oleh tim backend, tanpa ngasih tau saya. Nggak ada error apapun pas development. Baru ketahuan di production, dua minggu setelah deploy, waktu ada user yang laporan halaman kosong pas field itu null dan kode saya manggil .toUpperCase() di atasnya tanpa cek dulu. Kalau proyeknya pakai TypeScript, itu bakal jadi type error yang ketahuan sebelum saya commit, bukan bug production yang butuh dua minggu buat ketahuan.
Sejak itu error ketangkep sebelum runtime bukan lagi keuntungan abstrak buat saya — itu pengalaman konkret. Typo nama properti, lupa handle null, salah tipe argumen, semua ketahuan pas nulis kode, langsung di editor, bukan pas user klik tombol yang error di production berminggu-minggu kemudian.
Autocomplete juga jadi jauh lebih berguna begitu tipe-nya jelas. Editor tahu persis bentuk data yang lagi saya pegang, jadi saya nggak perlu bolak-balik cek definisi function di file lain atau nebak-nebak nama field dari response API yang saya lihat sekali doang waktu debugging kemarin.
Refactor jadi berani dengan cara yang nggak saya duga sebelumnya. Ganti nama field atau ubah shape sebuah object, compiler langsung nunjukin semua tempat yang perlu disesuaikan — biasanya lewat garis merah di puluhan file sekaligus. Tanpa tipe, refactor besar itu deg-degan, saya selalu takut ada satu pemanggilan fungsi yang kelewat, dan biasanya baru ketahuan pas testing manual yang nggak selalu nyentuh semua jalur kode.
Dokumentasi implisit lewat tipe itu manfaat yang baru saya sadar belakangan, bukan pas awal pindah. Function signature yang jelas tipenya itu dokumentasi yang nggak akan basi — beda banget sama komentar yang gampang ketinggalan zaman begitu implementasinya berubah tapi orangnya lupa update komentarnya.
Bukan berarti JavaScript polos jadi nggak relevan sama sekali. Buat script kecil sekali pakai, atau prototype yang bakal dibuang dalam sehari buat coba satu ide doang, overhead nulis tipe kadang nggak sepadan — saya masih suka bikin file .js lepas buat eksperimen cepat. Tapi buat apa pun yang bakal saya maintain lebih dari seminggu, atau apapun yang nyambung ke API eksternal yang bisa berubah tanpa saya tau, TypeScript sekarang jadi default, bukan pengecualian.