fungsiparameterMenengah3 mnt baca

Parameter dan Return Function

Anotasi parameter, return type, dan kenapa return type eksplisit itu penting.

Analogi: Mesin Berslot Label

Bayangin mesin fotokopi dengan slot berlabel: "masukkan kertas A4" dan "keluar hasil A4". Label itu janji: kamu tahu persis apa yang boleh masuk dan apa yang akan keluar tanpa membuka mesinnya. Anotasi parameter dan return type adalah label untuk fungsi.

Parameter Wajib Dianotasi

TypeScript tidak bisa menebak tipe parameter dari siapa yang memanggil, jadi parameter tanpa anotasi langsung diprotes (di strict mode):

typescript
function tambah(a, b) { return a + b; }
// Error: Parameter 'a' implicitly has an 'any' type.
// Error: Parameter 'b' implicitly has an 'any' type.

Versi yang benar sekaligus mengunci pemanggil yang salah:

typescript
function tambah(a: number, b: number): number {
  return a + b;
}

tambah("1", 2);
// Error: Argument of type 'string' is not assignable
//        to parameter of type 'number'.

Kenapa Return Type Eksplisit Penting

Inference memang bisa menebak return type, tapi anotasi eksplisit memberi tiga perlindungan:

  1. Dokumentasi gratis: pembaca tahu output tanpa membaca badan fungsi.
  2. Menangkap return nyasar: cabang kode yang tidak sengaja mengembalikan tipe salah langsung ketahuan.
  3. Kontrak stabil: refactor isi fungsi tidak bisa diam-diam mengubah tipe return yang dipakai puluhan pemanggil.

Contoh jebakan yang ditangkap anotasi return:

typescript
function cariNama(id: string): string {
  if (id === "") {
    return null; // Error: Type 'null' is not assignable to type 'string'.
  }
  return "Budi";
}

Tanpa anotasi : string, fungsi ini lolos dengan return type string | null dan semua pemanggil diam-diam harus menangani null. Dengan anotasi, kesalahan ketahuan di sumbernya.

Aturan yang sama berlaku untuk arrow function:

typescript
const kali = (a: number, b: number): number => a * b;

Kapan Dipakai di Project Nyata

  • Fungsi publik dan utilitas bersama: kontraknya dibaca banyak orang, anotasi lengkap itu wajib.
  • Callback dan handler: (err: Error | null, data: User) => void membuat ekspektasi eksplisit.
  • Batas modul dan API: return type eksplisit mencegah perubahan internal bocor ke konsumen.

Catatan teknis: Untuk fungsi yang melempar error atau tidak pernah selesai (loop selamanya), return type yang tepat adalah never, bukan void. Untuk fungsi yang selesai tanpa mengembalikan nilai, pakai void. Detailnya di modul void-never-function.

Contoh Nyata: Kontrak di Batas Modul

typescript
// lib/harga.ts
export function hitungTotal(harga: number, pajakPersen: number): number {
  return harga * (1 + pajakPersen / 100);
}

Pemakai modul ini tidak perlu membaca isinya: signature-nya sudah janji yang lengkap. Kalau besok implementasinya diubah (misalnya tambah diskon atau biaya layanan), return type number memastikan tidak ada pemanggil yang diam-diam rusak. Kontrak eksplisit membuat refactor antar modul jauh lebih berani.

Tantangan

Kontrak fungsi diskon

Buat fungsi hitungDiskon(harga: number, persen: number): number yang mengembalikan harga setelah diskon. Tambahkan validasi: persen harus 0-100, kalau tidak lempar Error. Pastikan return type eksplisit.

typescript
function hitungDiskon(harga: number, persen: number): number {
  // validasi persen, lalu hitung
}

console.log(hitungDiskon(100000, 20)); // 80000