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