Kalau kamu pernah menulis JavaScript, hampir pasti kamu pernah ketemu bug yang baru muncul saat halaman sudah berjalan — salah ketik nama properti, sebuah nilai yang ternyata undefined, atau fungsi yang dipanggil dengan argumen yang keliru. Di editor semuanya kelihatan baik-baik saja. Pas disimpan juga aman. Tapi begitu dibuka di browser, langsung error, dan kamu habiskan dua puluh menit cuma untuk mencari baris yang jadi biang keroknya.
TypeScript hadir untuk menangkap banyak kesalahan seperti itu lebih awal, sebelum kodenya sempat dijalankan. Anggap saja ia JavaScript dengan satu lapisan tambahan: kamu mendeskripsikan bentuk data yang kamu punya, lalu sebuah pemeriksa membaca kodemu untuk memastikan data itu dipakai dengan benar. Di artikel ini kita akan bahas apa saja yang sebenarnya kamu peroleh dalam praktik, di mana ia paling berguna, dan — yang sama pentingnya — kapan ia sebenarnya berlebihan.
TypeScript itu sebenarnya apa
TypeScript adalah superset dari JavaScript. Istilah “superset” kedengarannya teknis, tapi idenya sederhana: setiap program JavaScript yang valid otomatis sudah jadi TypeScript yang valid. Kamu tidak sedang belajar bahasa yang benar-benar baru. Kamu hanya menambahkan anotasi opsional — catatan kecil soal jenis nilai yang dipegang sebuah variabel, parameter, atau hasil fungsi — lalu membiarkan sebuah alat memeriksa apakah semuanya cocok.
Ada satu hal yang sering bikin pemula kaget: browser dan Node.js tidak menjalankan TypeScript secara langsung. Sebelum kodemu dipakai, ada tahap bernama kompilasi (atau transpilasi) yang membuang semua anotasi tipe dan mengubah file .ts menjadi file .js biasa. Tipe itu jadi panduan buat kamu dan si pemeriksa selama pengembangan; ia hilang sepenuhnya dari hasil akhir.
// Kamu menulis ini (TypeScript):
function greet(name: string): string {
return `Halo, ${name}`;
}
// Hasil kompilasinya jadi ini (JavaScript yang benar-benar berjalan):
function greet(name) {
return `Halo, ${name}`;
}
Jadi tipe tidak membuat programmu lebih cepat atau lebih lambat saat dijalankan. Tipe membuat kamu lebih cepat dan lebih aman saat menulisnya. Perbedaan inilah inti dari seluruh artikel ini.
Manfaat 1: menangkap error sebelum dijalankan
Ini fitur utamanya. Dengan JavaScript biasa, kesalahan cara memakai sebuah nilai baru ketahuan saat baris itu benar-benar dieksekusi — yang bisa jadi ada di cabang langka yang cuma kena seminggu sekali. TypeScript membaca seluruh proyekmu dan menandai kesalahannya begitu kamu menulisnya.
Lihat contoh kecil. Bayangkan sebuah fungsi yang menghitung harga setelah diskon.
// JavaScript biasa
function hargaAkhir(harga, persenDiskon) {
return harga - harga * (persenDiskon / 100);
}
// Di tempat lain, tanpa sengaja:
hargaAkhir("50000", 10); // harga malah berupa teks!
// Hasilnya: "50000-..." kacau, tanpa peringatan sama sekali
JavaScript dengan santai membiarkan kamu mengoper teks di tempat yang seharusnya angka, lalu diam-diam menghasilkan sampah. TypeScript langsung menahanmu:
// TypeScript
function hargaAkhir(harga: number, persenDiskon: number): number {
return harga - harga * (persenDiskon / 100);
}
hargaAkhir("50000", 10);
// Error: Argument of type 'string' is not assignable to parameter of type 'number'.
Garis merahnya muncul di editor saat itu juga, bahkan sebelum kamu menyimpan. Tidak perlu reload, tidak perlu klik-klik aplikasi untuk mengulang kejadiannya. Pesannya memberitahu persis apa yang salah dan di mana.
Tipe menyatakan maksud
Tipe seperti number bukan sekadar aturan — ia adalah pernyataan maksud. Kamu memberitahu semua orang (termasuk dirimu di masa depan) “fungsi ini mengharapkan angka sungguhan.” Si pemeriksa lalu memegang seluruh kode pada janji itu.
Manfaat 2: kode yang menjelaskan dirinya sendiri
Baca fungsi JavaScript ini, lalu coba tebak apa yang ia butuhkan:
function kirimFaktur(user, options) {
// ...
}
user itu apa? Sebuah objek? Dengan properti apa saja? Apa yang boleh masuk ke options? Kamu tidak akan tahu tanpa membuka isi fungsinya, menelusuri tempat ia dipanggil, atau bertanya ke orang yang menulisnya. Informasinya ada di kepala seseorang, bukan di dalam kode.
Sekarang versi TypeScript-nya:
type User = {
id: number;
name: string;
email: string;
};
type OpsiFaktur = {
currency: "IDR" | "USD";
sendCopy?: boolean; // tanda ? berarti opsional
};
function kirimFaktur(user: User, options: OpsiFaktur): void {
// ...
}
Sekarang kebutuhan fungsinya tertulis jelas di depan mata. Sebuah User punya id, name, dan email. Mata uangnya harus "IDR" atau "USD" — selain itu tidak boleh. sendCopy sifatnya opsional. Kamu tidak menulis satu komentar pun, tapi kodenya menjelaskan dirinya sendiri. Nanti saat kamu memanggil fungsi ini, editormu akan mengingatkan setiap kolom yang perlu kamu isi.
Ini lebih penting dari kelihatannya. Di proyek nyata seperti di ACY Partner Indonesia, kode jauh lebih sering dibaca daripada ditulis. Tipe mengubah “ini tadi butuhnya apa, ya?” jadi sesuatu yang tinggal kamu lihat.
Manfaat 3: autocomplete dan refactor yang benar-benar membantu
Karena editor tahu persis bentuk datamu, ia bisa membantumu dengan cara yang tak mungkin diberikan JavaScript biasa.
Autocomplete jadi tepat. Ketik user. dan editor langsung menawarkan persis id, name, dan email — bukan tebakan asal, melainkan daftar yang nyata dan lengkap. Salah mengingat nama properti? Kamu langsung tahu:
console.log(user.emial);
// Error: Property 'emial' does not exist on type 'User'. Did you mean 'email'?
Refactor jadi aman. Misalkan kamu mengganti nama email menjadi emailAddress di proyek yang besar. Di JavaScript, cari-ganti adalah judi — bisa saja ada yang terlewat, atau malah ikut mengganti email lain yang sebenarnya milik hal yang berbeda. Dengan TypeScript, fitur “rename symbol” di editor paham email mana yang merupakan email ini, lalu memperbarui semua pemakaian yang benar dan membiarkan yang lain. Kalau ada yang jadi tidak cocok, pemeriksanya memberitahumu sebelum kodenya dipakai.
Ini seperti perbedaan antara mengedit kode dengan lampu menyala dan dengan lampu mati. Makin besar kodenya, makin terasa bedanya.
Manfaat 4: tenang di kode yang besar dan berumur panjang
Skrip 50 baris tidak butuh banyak perlindungan. Aplikasi 50.000 baris yang sudah dirawat sebuah tim selama tiga tahun adalah cerita lain. Orang datang dan pergi. Tidak ada yang ingat setiap sudutnya. Perubahan di satu file merembet ke tempat-tempat yang sudah kamu lupakan keberadaannya.
Di sinilah TypeScript paling terasa nilainya. Saat kamu mengubah bentuk sebuah data inti — misalnya menambah kolom wajib ke User — pemeriksanya menyusuri seluruh proyek dan menunjuk setiap titik yang sekarang perlu diperbaiki. Alih-alih menemukan celahnya satu per satu lewat laporan crash, kamu dapat daftar rapi sebelum kodenya dipakai.
Ubah tipe User
│
▼
Pemeriksa tipe memindai seluruh proyek
│
├── checkout.ts ✓ masih aman
├── profile.ts ✗ kurang kolom baru ← perbaiki ini
└── invoice.ts ✗ kurang kolom baru ← dan ini
Jaring pengaman itulah alasan kenapa kebanyakan proyek frontend dan Node.js berukuran besar mengadopsi TypeScript seiring mereka tumbuh. Ia bisa mengimbangi skala dengan cara yang tak bisa ditandingi ingatan sebuah tim.
Biayanya, secara jujur
TypeScript tidak gratis, dan berpura-pura sebaliknya tidak akan menolongmu. Ada dua biaya nyata yang layak dipertimbangkan.
Ada tahap build. Karena browser tidak bisa menjalankan TypeScript langsung, kamu butuh tahap kompilasi dalam alur kerjamu. Sebagian besar alat frontend modern (bundler di balik framework seperti React, Vue, dan lainnya) menangani ini untukmu dengan sedikit pengaturan, tapi tetap saja ada satu komponen tambahan dibanding sekadar menaruh file .js ke halaman. Ada juga berkas konfigurasi, tsconfig.json, yang mengatur seberapa ketat si pemeriksa — defaultnya sudah masuk akal, tapi tetap satu hal lagi yang harus dipahami.
Ada kurva belajar. Kamu butuh waktu untuk belajar mendeskripsikan tipe: objek, array, gabungan pilihan ("IDR" | "USD"), kolom opsional, dan sesekali ide yang lebih rumit. Di awal-awal kamu mungkin ketemu error yang belum kamu tahu cara membenahinya, dan rasanya seperti alat ini sedang melawanmu. Rasa itu memudar seiring latihan, tapi memang nyata di awal.
Tipe bukan jaminan bebas dari semua bug
TypeScript memeriksa apakah kodemu konsisten secara internal. Ia tidak bisa memeriksa apa yang tidak ia lihat. Data yang datang dari sebuah permintaan jaringan, formulir, atau berkas hanyalah data saat dijalankan — kalau kamu bilang ke TypeScript bahwa itu sebuah User tanpa memverifikasinya, lalu server mengirim hal lain, tipe tadi cuma label penuh harapan, bukan fakta. Kamu tetap perlu validasi sungguhan di tepi-tepi programmu.
Kapan TypeScript layak dipakai — dan kapan JS biasa sudah cukup
Jadi, apakah kamu harus selalu memakainya? Belum tentu. Berikut cara praktis untuk memutuskan.
| Situasi | Pilihan yang lebih pas |
|---|---|
| Skrip cepat yang dijalankan sekali lalu dibuang | JavaScript biasa |
| Demo kecil atau beberapa baris kode perekat | JavaScript biasa |
| Belajar dasar-dasar pemrograman | JavaScript dulu, TypeScript menyusul |
| Aplikasi yang dirawat beberapa orang | TypeScript |
| Kode yang akan hidup dan tumbuh berbulan-bulan atau bertahun-tahun | TypeScript |
| Apa pun yang bug-nya bisa merugikan uang atau kepercayaan | TypeScript |
Aturan kasarnya: makin lama kode akan hidup, dan makin banyak orang yang menyentuhnya, makin sepadan tipe dengan biayanya. Untuk potongan kode sekali pakai, tahap build dan anotasi cuma jadi gesekan yang tidak kamu butuhkan. Untuk sebuah produk, keduanya adalah investasi yang berbalik berkali-kali lipat.
Ada juga jalan tengah yang nyaman. Banyak tim menulis JavaScript biasa tapi menambahkan informasi tipe lewat komentar khusus (JSDoc), sehingga dapat sebagian besar manfaat editor tanpa migrasi penuh. Dan TypeScript sendiri bisa diadopsi bertahap — kamu bisa menaikkan pengaturan ketatnya pelan-pelan, bukan membenahi semuanya di hari pertama.
Rangkuman
TypeScript adalah JavaScript ditambah lapisan yang mendeskripsikan bentuk datamu dan memeriksa apakah kamu memakainya dengan benar. Manfaat nyatanya jelas:
- Error tertangkap lebih awal — banyak bug muncul di editormu, bukan di produksi.
- Kode menjelaskan diri sendiri — tanda tangan fungsi menyatakan persis apa yang dibutuhkan, tanpa tebak-tebakan.
- Tooling lebih tajam — autocomplete yang tepat dan refactor yang mengganti nama hal yang benar dengan aman.
- Tenang dalam skala besar — ubah data inti, dan pemeriksa menunjukkan setiap titik yang perlu kamu perbaiki.
Biayanya pun nyata: tahap build yang harus dipelajari dan dirawat, serta kurva belajar selagi kamu terbiasa mendeskripsikan tipe. Dan tipe memeriksa konsistensi, bukan kebenaran — data dari dunia luar tetap perlu divalidasi.
Kesimpulan jujur untuk pemula begini: silakan terus menulis JavaScript biasa untuk pekerjaan cepat sekali pakai, tapi begitu kodemu jadi sesuatu yang dibaca, dirawat, dan diandalkan orang lain, TypeScript berhenti menjadi beban opsional dan mulai menjadi salah satu alat terbaik yang kamu punya untuk menjaga kode itu tetap benar selagi ia tumbuh.