any, unknown, never, void, null & undefined
Tipe-tipe khusus: mengapa any berbahaya, unknown sebagai alternatif aman, void untuk fungsi tanpa hasil, never untuk yang tidak pernah terjadi, serta strictNullChecks untuk null dan undefined.
any: pintu darurat yang mematikan proteksi
any berarti "tipe apa saja" — TypeScript berhenti memeriksa nilai itu sama sekali.
let data: any = "halo"
data = 42 // ✅ tidak ada keberatan
data.fungsiNgawur() // ✅ compiler diam... lalu program crash saat dijalankan 💥
any menular. Hasil operasi dari any juga any, sehingga satu any bisa membocorkan "tanpa proteksi" ke banyak bagian kode. Anggap any sebagai pilihan terakhir, bukan jalan pintas.
unknown: "belum tahu" yang aman
unknown juga bisa menampung nilai apa saja, tetapi kamu wajib memeriksa tipenya sebelum memakainya. Ini cara yang benar untuk data yang tipenya belum pasti (input pengguna, JSON, respons API).
let nilai: unknown = "42"
nilai.toUpperCase() // ❌ 'nilai' is of type 'unknown'
if (typeof nilai === "string") {
nilai.toUpperCase() // ✅ sudah dipersempit jadi string
}
any | unknown | |
|---|---|---|
| Boleh diisi nilai apa saja | Ya | Ya |
| Boleh dipakai langsung | Ya (tanpa pemeriksaan) | Tidak — harus di-narrow dulu |
| Keamanan | Tidak aman | Aman |
Aturan praktis: bingung memilih? Pakai unknown, bukan any.
void: fungsi yang tidak mengembalikan apa-apa
function catat(pesan: string): void {
console.log(pesan)
// tidak ada return bernilai
}
never: tidak akan pernah terjadi
never adalah tipe untuk sesuatu yang tidak mungkin ada nilainya: fungsi yang selalu melempar error atau berputar selamanya, dan percabangan yang sudah mustahil.
function gagal(pesan: string): never {
throw new Error(pesan)
}
Pemakaian paling berguna: pemeriksaan kelengkapan (exhaustiveness) agar tidak ada kasus yang terlewat saat menambah pilihan baru:
type Bentuk = "lingkaran" | "kotak"
function luas(b: Bentuk): number {
switch (b) {
case "lingkaran": return 3.14
case "kotak": return 4
default: {
const tidakMungkin: never = b // jika kelak ditambah "segitiga" tapi lupa dibuat case-nya → ERROR di sini
return tidakMungkin
}
}
}
null dan undefined
Dengan pengaturan strict (dibahas di bab 20), null dan undefined bukan anggota semua tipe lagi. Inilah yang menghapus "kesalahan miliaran dolar" — crash akibat null yang tak terduga.
let nama: string = null // ❌ Type 'null' is not assignable to type 'string'
let nama2: string | null = null // ✅ kita nyatakan terbuka untuk null
Perangkat untuk menanganinya:
function panjangNama(nama: string | null | undefined): number {
if (nama == null) return 0 // == null menangkap null DAN undefined
return nama.length
}
const user = { profil: { kota: "Solo" } } as { profil?: { kota: string } }
user.profil?.kota // optional chaining: undefined bila profil tidak ada
user.profil?.kota ?? "-" // nullish coalescing: nilai cadangan hanya untuk null/undefined
const pasti = user.profil!.kota // non-null assertion (!): "percayalah, ini ada" — hindari bila bisa
Bedakan ?? dan ||: 0 || 10 hasilnya 10 (0 dianggap falsy), tetapi 0 ?? 10 hasilnya 0. Untuk "nilai cadangan jika kosong" hampir selalu yang kamu mau adalah ??.
Ringkasan
| Tipe | Arti | Kapan dipakai |
|---|---|---|
any | Matikan pemeriksaan | Hampir tidak pernah |
unknown | Tipe belum diketahui, harus diperiksa | Data dari luar |
void | Tidak ada hasil | Fungsi yang hanya "melakukan sesuatu" |
never | Tidak pernah terjadi | Fungsi yang selalu error, cek kelengkapan |
null/undefined | Tidak ada nilai | Dinyatakan lewat union (T | null) |
Kesalahan umum pemula
- Menyelesaikan error tipe dengan menempelkan
any. Itu menyembunyikan masalah, bukan memperbaikinya. - Memakai
!(non-null assertion) sembarangan sehingga crash tetap terjadi saat program berjalan. - Mengira
voiddanundefinedsama persis. Mirip, tetapivoidmenyatakan "hasilnya tidak untuk dipakai".