TypeScript - Never: Memahami Tipe Bawah

Hai, para pemula pemrograman! Hari ini, kita akan mendalamkan salah satu tipe yang lebih mistis di TypeScript: tipe never. Jangan khawatir jika Anda baru saja memulai pemrograman – saya akan mengarahkan Anda melalui konsep ini langkah demi langkah, seperti yang saya lakukan untuk ribuan siswa dalam tahunajaran pengajaran saya. Jadi, ambil minuman favorit Anda, dan mari kita berangkat ke perjalanan yang menarik ke dunia TypeScript!

TypeScript - Never

Apa itu tipe never?

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

Kapan never digunakan?

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

Marilah 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 biasa. Oleh karena itu, tipe pengembalian nya 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 menutupi semua kemungkinan bentuk. Jika kita menambahkan bentuk baru ke dalam Shape tapi lupa menambahkan kasus untuknya 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 pengembalian nya adalah never. Itu seperti mengatakan kepada teman Anda Anda akan berhenti berbicara "never" – mereka tahu mereka dalam perbincangan yang panjang!

Perbandingan tipe never dan void

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

void

Tipe void digunakan saat sebuah fungsi tidak mengembalikan nilai apa pun, tetapi itu benar-benar menyelesaikan eksekusinya.

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

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

never

Sementara itu, tipe never 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

Marilah 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 tangkap kasus yang mungkin kita lewatkan. Itu seperti memiliki jaring keselamatan saat Anda belajar mengayun jenis!

Contoh 5: Deteksi Kode Yang 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 mengemudi ke tempat yang tidak ada!

Metode dan Properti never

Sekarang, Anda mungkin berpikir, "Apakah never memiliki metode atau properti apa pun?" Kebenarannya, never tidak memiliki metode atau properti miliknya 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
Memanggil 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 itu dia, teman-teman saya! Kita telah berpergian melalui negeri never, mengungkapi sudut-sudut dan lubang-lubangnya. Ingat, never adalah seperti teman yang selalu membatalkan rencana – mereka tidak pernah muncul, tetapi mereka tetap penting untuk dipertimbangkan!

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

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

Credits: Image by storyset