Learn
← Previous Next →

Hari 7: Generics — Pengenalan

70 min Last updated 09 Apr 2026

Mengapa Generics?

// Tanpa generics: tidak reusable atau tidak aman
function ambilPertama(arr: any[]): any { return arr[0]; }
const x = ambilPertama([1, 2, 3]); // x: any — tidak aman!

// Dengan generics: reusable DAN aman
function ambilPertama(arr: T[]): T | undefined { return arr[0]; }
const n = ambilPertama([1, 2, 3]);     // n: number — ✅
const s = ambilPertama(["a", "b"]);    // s: string — ✅

Generic Functions

function pasangkan(a: T, b: U): [T, U] {
    return [a, b];
}
const pair = pasangkan("nama", 42); // [string, number]

function swap(pair: [T, U]): [U, T] {
    return [pair[1], pair[0]];
}
const swapped = swap(["halo", 100]); // [number, string]

Generic Constraints

// T harus punya properti length
function tampilPanjang(item: T): string {
    return `Panjang: ${item.length}`;
}
tampilPanjang("hello");   // ✅ string punya length
tampilPanjang([1, 2, 3]); // ✅ array punya length
// tampilPanjang(42);      // ❌ number tidak punya length

// K harus merupakan key dari T
function ambilProperty(obj: T, key: K): T[K] {
    return obj[key];
}
const user = { nama: "Budi", umur: 25 };
const n2 = ambilProperty(user, "nama"); // n2: string ✅
// ambilProperty(user, "email");         // ❌ "email" bukan key user

💡 Notice: Generic <T> memungkinkan fungsi yang sama bekerja untuk berbagai tipe dengan tetap aman. TypeScript akan inferkan T dari argument yang diberikan.

Assignment

Buat generic function filter<T>(arr: T[], predicate: (item: T) => boolean): T[]. Buat generic function mapArray<T, U>(arr: T[], fn: (item: T) => U): U[]. Test dengan angka dan string.

Expected output:

Genap: 2, 4, 6, 8, 10
Kuadrat: 4, 16, 36, 64, 100
Kata panjang: mangga, pisang
TS index.ts
Solution
Output