Function Overloads — TypeScript

Kadang sebuah fungsi benar-benar menerima bentuk parameter yang berbeda. Contoh: formatTanggal(new Date()) atau formatTanggal("2024-01-03"). Satu union type bis

Kadang sebuah fungsi benar-benar menerima bentuk parameter yang berbeda. Contoh: formatTanggal(new Date()) atau formatTanggal("2024-01-03"). Satu union type bisa, tapi kurang ekspresif — TypeScript tidak tahu kalau input string, output Date, dan sebaliknya.

Function overload = deklarasikan beberapa signature untuk satu fungsi, lalu tulis satu implementasi yang menanganinya.

// Signature 1: Date masuk, string keluar
function formatTanggal(input: Date): string;
// Signature 2: string masuk, Date keluar
function formatTanggal(input: string): Date;
// Implementasi — tidak dipanggil langsung oleh caller
function formatTanggal(input: Date | string): string | Date {
  if (input instanceof Date) {
    return input.toISOString().split("T")[0];
  }
  return new Date(input);
}

const teks = formatTanggal(new Date());      // string
const tanggal = formatTanggal("2024-01-03"); // Date

Aturan:

Kapan dipakai, kapan tidak:

Pakai overload saat input/output berpasangan jelas dan union type menyembunyikan informasi. Lihat contoh formatTanggal: signature menjelaskan "kalau input string, output Date", yang tidak terlihat dengan (Date | string) => Date | string.

Untuk kasus sederhana (beberapa tipe, output sama), union type biasa atau generic sudah cukup:

// Tidak butuh overload — union cukup
function panjang(input: string | any[]): number {
  return input.length;
}