Recraftory

TypeScript - Function dan Operator

Function dengan Tipe

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

// Arrow function dengan tipe eksplisit
const kali: (a: number, b: number) => number = (a, b) => a * b;

// Function expression
const kurangi = function (a: number, b: number): number {
  return a - b;
};

Optional dan Default Parameter

// Optional parameter dengan ?
function salam(nama: string, pesan?: string): string {
  if (pesan) {
    return `${pesan}, ${nama}!`;
  }
  return `Halo, ${nama}!`;
}

// Default parameter
function sapa(nama: string, pesan: string = "Halo"): string {
  return `${pesan}, ${nama}!`;
}

salam("Budi");           // "Halo, Budi!"
salam("Budi", "Selamat"); // "Selamat, Budi!"

Rest Parameter

function jumlahkan(...angka: number[]): number {
  return angka.reduce((total, n) => total + n, 0);
}

jumlahkan(1, 2, 3, 4, 5); // 15

Function Overloading

function proses(input: string): string;
function proses(input: number): number;
function proses(input: string | number): string | number {
  if (typeof input === "string") {
    return input.toUpperCase();
  }
  return input * 2;
}

proses("hello"); // "HELLO"
proses(5);       // 10

Type Narrowing

function prosesInput(input: string | number) {
  if (typeof input === "string") {
    // TypeScript tahu input adalah string di sini
    return input.toUpperCase();
  } else {
    // TypeScript tahu input adalah number di sini
    return input.toFixed(2);
  }
}

Discriminated Union

interface Lingkaran {
  jenis: "lingkaran";
  radius: number;
}

interface Persegi {
  jenis: "persegi";
  sisi: number;
}

type Bentuk = Lingkaran | Persegi;

function hitungLuas(bentuk: Bentuk): number {
  switch (bentuk.jenis) {
    case "lingkaran":
      return Math.PI * bentuk.radius ** 2;
    case "persegi":
      return bentuk.sisi ** 2;
  }
}