TypeScript - Never: Menjelajah Tipe Dasar

Hai, para pemrogram yang sedang mencari ilmu! Hari ini, kita akan mempelajari salah satu tipe yang agak misterius di TypeScript: tipe never. Jangan khawatir jika Anda baru saja memulai berprogram – saya akan memandu Anda melalui konsep ini secara langkah demi langkah, sama seperti yang saya lakukan bagi ribuan murid dalam tahunajaran pengajaran saya. Jadi, ambil minuman favorit Anda, dan mari kita mulai perjalanan yang menarik ke dunia TypeScript!

TypeScript - Never

Apa itu tipe never?

Tipe never di TypeScript sering disebut sebagai "tipe dasar" atau "tipe kosong". Ini mewakili sebuah tipe yang seharusnya tidak pernah terjadi. Sekarang, Anda mungkin berpikir, " Mengapa kita butuh tipe yang tidak pernah terjadi?" Well, teman yang curiga, itu jauh lebih berguna daripada yang Anda pikirkan!

Kapan tipe never digunakan?

  1. Untuk mewakili skenario yang mustahil
  2. Untuk menangani pemeriksaan yang eksklusif
  3. Dalam fungsi yang tidak pernah mengembalikan nilai

mari kita lihat beberapa contoh untuk membuat konsep ini lebih jelas.

Contoh 1: Mewakili Skenario yang Mustahil

function throwError(message: string): never {
throw new Error(message);
}

let result = throwError("Oops! Ada kesalahan!");
console.log(result); // Baris ini tidak akan pernah dicapai

Dalam contoh ini, fungsi throwError menjamin untuk melempar kesalahan dan tidak pernah mengembalikan nilai secara normal. Oleh karena itu, tipe kembalinya adalah never.

Pikirkan seperti ini: jika Anda sedang memasak kue dan resepnya mengatakan "baking sampai never," Anda tahu bahwa kue itu tidak akan keluar dari oven!

Contoh 2: Pemeriksaan Eksklusif

type Shape = "circle" | "square" | "triangle";

function getArea(shape: Shape): number {
switch (shape) {
case "circle":
return Math.PI * Math.pow(5, 2);
case "square":
return 10 * 10;
case "triangle":
return (10 * 5) / 2;
default:
const _exhaustiveCheck: never = shape;
return _exhaustiveCheck;
}
}

Di sini, never membantu kita memastikan kita telah mencakup semua kemungkinan bentuk. Jika kita menambahkan bentuk baru ke tipe Shape tapi lupa menambahkan kasus untuk itu di getArea, TypeScript akan memberikan kesalahan kepada kita. Itu seperti memiliki asisten yang membantu Anda ingat saat Anda lupa sesuatu!

Contoh 3: Fungsi Yang Tidak Pernah Mengembalikan Nilai

function infiniteLoop(): never {
while (true) {
console.log("Loop ini tidak pernah berakhir!");
}
}

Fungsi ini akan berjalan selamanya (atau sampai komputer Anda kehabisan memori). Karena itu tidak pernah selesai dieksekusi, tipe kembalinya adalah never. Itu seperti mengatakan kepada teman Anda Anda akan berhenti berbicara "never" – mereka tahu mereka dalam perjalanan yang panjang!

Perbandingan tipe never dan void

Sekarang Anda mungkin berpikir, "Bagaimana perbedaan antara never dan void?" Pertanyaan bagus! Mari kitauraikan itu.

void

Tipe void digunakan saat sebuah fungsi tidak mengembalikan nilai apa pun, tapi itu masih menyelesaikan eksekusinya.

function logMessage(message: string): void {
console.log(message);
}

logMessage("Hai, TypeScript!"); // Fungsi ini mengembalikan undefined

never

Tipe never, dari sisi lain, digunakan saat sebuah fungsi tidak pernah menyelesaikan eksekusinya atau selalu melempar kesalahan.

function failwithError(message: string): never {
throw new Error(message);
}

failwithError("Fungsi ini tidak pernah mengembalikan nilai!");

Pikirkan seperti ini: void adalah seperti pergi ke toko dan kembali tanpa apa-apa, sedangkan never adalah seperti memulai perjalanan tanpa tujuan – Anda tidak pernah kembali!

Penggunaan Praktis never

Mari kita lihat beberapa contoh lain dimana never bisa berguna.

Contoh 4: Type Guards

type Square = { kind: "square", size: number };
type Circle = { kind: "circle", radius: number };
type Shape = Square | Circle;

function assertNever(x: never): never {
throw new Error("Objek tak terduga: " + x);
}

function getArea(shape: Shape) {
switch (shape.kind) {
case "square": return shape.size * shape.size;
case "circle": return Math.PI * shape.radius ** 2;
default: return assertNever(shape); // Kesalahan jika shape bukan Square atau Circle
}
}

Dalam contoh ini, assertNever membantu kita menangkap kasus yang mungkin kita lewatkan. Itu seperti memiliki jaring keselamatan saat Anda belajar mengayun jenis!

Contoh 5: Deteksi Kode Tak Dapat Dijangkau

function neverReaches(): never {
while (true) {
// Operasi tertentu
}
console.log("Baris ini tidak akan pernah dicapai");  // Kesalahan TypeScript
}

TypeScript cukup cerdas untuk mengetahui bahwa pernyataan console.log tidak akan pernah dicapai, dan akan memberikan Anda kesalahan. Itu seperti memiliki GPS yang memberitahu Anda saat Anda mencoba mengendarai ke tempat yang tidak ada!

Metode dan Properti never

Sekarang Anda mungkin berpikir, "Apakah never memiliki metode atau properti?" Kebenarannya, never tidak memiliki metode atau properti sendiri karena itu mewakili tipe yang seharusnya tidak pernah terjadi. Namun, itu masih menjadi bagian penting dari sistem tipe TypeScript.

Berikut adalah tabel yang menggabungkan apa yang Anda (atau tidak) bisa lakukan dengan never:

Operasi Hasil Penjelasan
Assign ke never ✅ Diperbolehkan Setiap tipe dapat diassign ke never
Assign never ke jenis lain ❌ Tidak Diperbolehkan never tidak dapat diassign ke jenis lain
Pemanggilan metode pada never ❌ Tidak Diperbolehkan Karena never seharusnya tidak pernah terjadi, Anda tidak dapat memanggil metode pada itu
Menggunakan never dalam gabungan ✅ Diperbolehkan tetapi tanpa efek never diabaikan dalam jenis gabungan
Menggunakan never dalam interseksi ✅ Diperbolehkan dan menghasilkan never Setiap jenis yang diinterseksi dengan never menghasilkan never

Kesimpulan

Dan begitulah, murid-murid tercinta! Kita telah melakukan perjalanan melalui negeri never, menjelajahi setiap sudut dan lubangnya. Ingat, never adalah seperti teman yang selalu membatalkan rencana – mereka tidak pernah datang, tetapi mereka tetap penting untuk dipikirkan!

Memahami never mungkin tampak sulit pada awalnya, tapi dengan latihan, Anda akan menemukan itu adalah alat yang tak ternilai dalam peralatan TypeScript Anda. Itu membantu membuat kode Anda lebih kuat, menangkap kesalahan potensial, dan bahkan membuat Anda berpikir lebih mendalam tentang perilaku fungsi Anda.

Terus coding, terus belajar, dan jangan katakan "never" untuk mencoba hal baru di TypeScript! Sampaijumpa lagi, semoga kesalahan kompilasi Anda sedikit dan inferensi jenis Anda kuat!

Credits: Image by storyset