Coba perhatiin dua potongan kode ini:
vs
Keduanya sama-sama valid di TypeScript, dan keduanya sama-sama aman. Bedanya, versi kedua gak perlu nulis anotasi tipe sama sekali, tapi TypeScript tetap tahu
Banyak pemula yang belum ngeh soal ini, akhirnya kebiasaan nulis anotasi tipe di semua tempat, padahal banyak yang sebenarnya gak perlu. Efeknya, kode jadi lebih panjang dari yang seharusnya, dan malah kelihatan lebih ribet dibanding manfaatnya.
Gimana Sebenarnya Type Inference Bekerja
TypeScript nebak tipe data dari beberapa sumber, tergantung konteksnya. Yang paling gampang adalah dari nilai literal yang kamu tulis langsung.
Selain dari nilai literal, TypeScript juga bisa nebak tipe dari return value sebuah fungsi, tanpa kamu perlu nulis tipe return-nya secara eksplisit.
Yang menarik, meskipun kamu gak nulis
Contextual Typing, Nebak Tipe dari "Situasi Sekitar"
Selain nebak dari nilai langsung, TypeScript juga punya kemampuan yang disebut contextual typing, yaitu nebak tipe berdasarkan konteks di mana kode itu dipakai, bukan cuma dari nilainya sendiri.
Contoh paling gampang ada di event handler:
Perhatiin, kamu gak nulis tipe apa-apa buat parameter
Ini juga kejadian pas kamu kerja sama array method kayak
Kapan Inference Bisa Menyesatkan
Type inference emang membantu banget, tapi bukan berarti dia selalu sempurna. Ada beberapa kasus umum di mana inference justru bisa bikin bug yang gak kelihatan di awal.
Array Kosong
Coba tebak, tipe apa yang TypeScript kasih ke
Solusinya, kasih anotasi eksplisit dari awal kalau kamu udah tahu isinya bakal apa:
Objek yang Bentuknya Berubah Seiring Waktu
Ini sering bikin bingung pemula. Kenapa error padahal cuma nambahin properti baru? Jawabannya, pas kamu nulis
Solusinya, definisiin bentuk lengkap dari awal, entah lewat interface atau langsung di deklarasi:
Best Common Type yang Kadang Terlalu Luas
Kalau kamu bikin array yang isinya campuran beberapa tipe, TypeScript bakal nyari "best common type", alias tipe gabungan yang paling masuk akal buat nampung semuanya.
Ini sebenarnya udah bener secara teknis, tapi kadang terlalu luas buat kebutuhan kamu. Kalau kamu sebenarnya cuma pengen array angka aja dan yang lain itu kesalahan input, inference kayak gini justru bisa nutupin bug yang sebenarnya harusnya ketahuan dari awal.
Jadi, Kapan Sebaiknya Tetap Nulis Anotasi Manual?
Aturan umumnya, biarin TypeScript nebak sendiri kalau nilainya udah jelas dan gak ambigu, kayak variabel lokal dengan nilai langsung, atau return value fungsi yang sederhana. Tapi ada beberapa situasi di mana nulis anotasi eksplisit tetap lebih baik, meskipun secara teknis gak wajib.
Parameter fungsi, karena TypeScript gak bisa nebak tipe parameter dari mana pun kalau kamu gak kasih tahu:
Return type fungsi publik yang dipakai di banyak tempat, biar ada "kontrak" yang jelas dan gak berubah tanpa sengaja pas kamu refactor isi fungsinya.
Array atau objek kosong yang bakal diisi belakangan, kayak contoh
Variabel yang emang sengaja fleksibel di awal, misalnya state di komponen UI yang awalnya
Kalau kamu gak kasih anotasi di kasus terakhir ini, TypeScript bakal nganggep
Kesimpulan
Type inference itu salah satu fitur yang bikin TypeScript kerasa gak seribet yang dibayangin orang pas pertama kali denger "bahasa dengan tipe statis". Kamu gak perlu nulis tipe di setiap baris, karena TypeScript udah cukup pinter buat nebak sendiri di banyak kasus. Tapi penting buat tahu di titik mana inference bisa menyesatkan, kayak array kosong, objek yang bentuknya berubah, atau best common type yang kelewat luas, biar kamu tahu kapan harus turun tangan dan nulis anotasi manual.
Di artikel selanjutnya, kita bakal masuk ke union, intersection, dan discriminated union, salah satu fitur paling kuat di TypeScript buat memodelkan data yang punya banyak kemungkinan bentuk, kayak state loading, success, dan error di aplikasi nyata.




