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:
- Semua signature (overload) harus dideklarasikan sebelum implementasi.
- Implementasi tidak dipanggil caller — ia hanya internal. Tipenya harus compatible dengan semua signature.
- Urutkan dari signature paling spesifik ke paling umum (penting saat ada tumpang tindih).
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;
}