Tipe Spesial: The Good, The Bad, & The Weird 👽
Di TS, ada tipe data yang fungsinya bukan buat nyimpen data, tapi buat Mengontrol Perilaku kodingan. Kita bahas dari yang paling bahaya sampe yang paling ketat.
1. The Bad: any 😈
any adalah cara kita bilang ke TypeScript: "Terserah lo dah mau isi gue apa aja"
Saat lo pake any, lo mematikan semua fitur keamanan TS buat variabel itu.
// Lo bisa isi apa aja
let sampah: any = "Halo";
sampah = 100;
sampah = false;
// ⚠️ BAHAYA: Lo bisa akses property ngawur tanpa error di Editor!
// Editor gak merah, tapi pas dijalankan CRASH (Runtime Error).
sampah.fungsiYangGakAda();Kapan Boleh Pake any?
Hanya ada 2 kondisi yang dimaafkan:
-
Migrasi Project: Lo mindahin kodingan JS lama ke TS dan males benerin error satu-satu.
-
Library 3rd Party Buruk: Lo pake library orang lain yang gak punya definisi tipe data (jarang terjadi sekarang).
2. The Good: unknown 🛡️
Ini adalah saudara kembar any, tapi Versi Aman. Dia bisa nerima data apa aja, TAPI Gak bisa dipake sembarangan sebelum dicek isinya.
let kotakMisteri: unknown;
kotakMisteri = "Ini String"; // Boleh masukin apa aja
kotakMisteri = 100;
// ❌ Error! TS ngelarang: "Eits, cek dulu isinya apaan!"
// let hasil = kotakMisteri + 10;
// ✅ Solusi: Type Narrowing (Penyempitan Tipe)
if (typeof kotakMisteri === "number") {
// Di dalam blok if ini, TS tau kotakMisteri adalah NUMBER
let hasil = kotakMisteri + 10; // Aman
console.log(hasil);
}Tips Pro: Kalau lo nerima data dari API (Fetch) yang lo gak tau bentuknya, pake
unknown dulu, jangan any. Itu memaksa lo buat validasi data.
3. The Void: void 🕳️
Dipake khusus buat Function yang tidak mengembalikan nilai (Gak ada return).
const logPesan = (pesan: string): void => {
console.log(pesan);
// Secara teknis, JS akan return 'undefined' di belakang layar.
// Tapi bagi TS, ini dianggap 'void' (jangan dipake nilainya).
};
// ❌ Error! Gak bisa dimasukin ke variabel
// const hasil: string = logPesan("Halo");4. The Weird: never 🚫
Ini tipe yang paling unik. Artinya: "Nilai yang GAK AKAN PERNAH terjadi." Beda sama void (yang masih return undefined), never bener-bener gak sampai ke titik finish.
Kasus 1: Error Throwing
Function yang melempar error itu gak pernah selesai secara normal.
const errorFatal = (msg: string): never => {
throw new Error(msg);
// Code di bawah sini gak akan pernah jalan (Unreachable)
};Kasus 2: Infinite Loop
const loopSelamanya = (): never => {
while (true) {
console.log("Muter...");
}
};Kasus 3: Exhaustive Check (Ilmu Tingkat Dewa) 🤯
Ini trik yang sering dipake Senior Dev buat mastiin semua kemungkinan udah dihandle.
type Role = "Admin" | "User";
function cekRole(role: Role) {
if (role === "Admin") {
// Logic Admin
} else if (role === "User") {
// Logic User
} else {
// Blok ini tipenya 'never'.
// Kenapa? Karena semua kemungkinan (Admin & User) udah diambil di atas.
// Jadi gak mungkin ada sisa yang masuk sini.
const sisa: never = role;
}
}Gunanya apa?
Misal nanti lo tambah role baru: type Role = "Admin" | "User" | "Guest". Maka kodingan di atas bakal ERROR MERAH di baris const sisa: never = role. Kenapa? Karena si "Guest" masuk ke else, padahal else itu jatahnya never (kosong).
Ini cara TS ngingetin lo: "Woy, lo nambah role Guest tapi lupa handle logic-nya di function cekRole!". Keren kan?