# 🧠 Perbedaan never, undefined, null, unknown, dan any di TypeScript

Dalam TypeScript, kita sering menemukan berbagai tipe data khusus yang sekilas mirip, tapi ternyata **beda peran dan makna**. Artikel ini akan membahas 5 di antaranya: `never`, `undefined`, `null`, `unknown`, dan `any`.

---

## 📌 1. `undefined`: Tidak Diberi Nilai

### Penjelasan:

`undefined` muncul saat **sesuatu belum diberi nilai**.

### Contoh:

```ts
let x: number | undefined;

console.log(x); // undefined
```

Atau pada return function tanpa `return`:

```ts
function doSomething(): void {}
console.log(doSomething()); // undefined
```

### Kapan pakai?

* Saat properti atau variabel bisa belum diisi.
    
* Saat opsional: `function (x?: number)` → `x` bisa `undefined`.
    

---

## 📌 2. `null`: Nilai Kosong yang Disengaja

### Penjelasan:

`null` artinya nilai **kosong dengan sengaja**, bukan lupa mengisi.

### Contoh:

```ts
let user: string | null = null;
```

### Perbandingan:

```ts
let a;           // undefined
let b = null;    // null
```

---

## 📌 3. `any`: Bebas Merdeka (Berbahaya)

### Penjelasan:

`any` artinya **bebas isi apa saja**. TypeScript menyerah, tidak mengecek tipe.

### Contoh:

```ts
let data: any = "text";
data = 123;
data = true;
```

### Bahaya:

```ts
data.toUpperCase(); // OK saat compile, tapi bisa error saat runtime!
```

> ❗ Hindari `any` kecuali kamu sangat yakin.

---

## 📌 4. `unknown`: Bebas Tapi Harus Diperiksa Dulu

### Penjelasan:

`unknown` mirip `any`, tapi **tidak bisa langsung digunakan** tanpa pemeriksaan tipe dulu.

### Contoh:

```ts
let input: unknown = "hello";

// input.toUpperCase(); ❌ Error

if (typeof input === "string") {
  console.log(input.toUpperCase()); // ✅ Aman
}
```

> ✅ Gunakan `unknown` saat menerima data eksternal (API, `JSON.parse`, dll).

---

## 📌 5. `never`: Tidak Akan Pernah Terjadi

### Penjelasan:

`never` artinya **fungsi/tindakan tidak pernah menghasilkan nilai** — biasanya karena:

1. **Throw error**
    
2. **Loop tak berujung**
    
3. **Exhaustiveness checking**
    

### Contoh:

```ts
function crash(): never {
  throw new Error("Boom!");
}
```

Atau:

```ts
function infinite(): never {
  while (true) {}
}
```

Atau:

```ts
type Shape = "circle" | "square";
function draw(s: Shape) {
  if (s === "circle") return;
  if (s === "square") return;

  const neverValue: never = s; // 👈 Aman karena semua case tertangani
}
```

---

## 🔁 Ringkasan Tabel

| Tipe | Arti | Contoh | Catatan Penggunaan |
| --- | --- | --- | --- |
| `undefined` | Belum diisi | \`let a: number | undefined\` |
| `null` | Kosong disengaja | \`let a: string | null\` |
| `any` | Bebas tanpa kontrol | `let x: any = 42` | Hindari kecuali sangat terpaksa |
| `unknown` | Bebas, tapi harus diperiksa | `let x: unknown; if (typeof x === "string")` | Lebih aman daripada `any` |
| `never` | Tidak mungkin terjadi | `throw new Error()`, `while(true)` | Untuk kasus ekstrem / exhaustiveness check |

---

## 🎓 Tips Mengajar Santri:

* Gunakan analogi:
    
    * `undefined`: seperti gelas kosong belum diisi.
        
    * `null`: gelas sengaja dikosongkan.
        
    * `any`: seperti membawa benda apapun ke kelas — bisa berbahaya.
        
    * `unknown`: bawa benda aneh, tapi harus diperiksa dulu.
        
    * `never`: pintu keluar yang tidak pernah terbuka.
        
* Tambahkan latihan deteksi tipe:
    
    ```ts
    function detect(val: any) {
      if (typeof val === "string") return "string";
      if (typeof val === "number") return "number";
      return "something else";
    }
    ```
