Generics memungkinkan fungsi/class bekerja dengan berbagai tipe tanpa kehilangan type safety:
// Tanpa generics — harus pakai any (tidak aman)
function pertama(arr: any[]): any { return arr[0]; }
// Dengan generics — type safe!
function pertama<T>(arr: T[]): T { return arr[0]; }
pertama<number>([1, 2, 3]); // return type: number
pertama<string>(["a", "b"]); // return type: string
pertama([true, false]); // TS infer: boolean
Generic constraints:
function panjang<T extends { length: number }>(item: T): number {
return item.length;
}
panjang("hello"); // OK — string punya .length
panjang([1, 2, 3]); // OK — array punya .length
panjang(123); // ❌ — number tidak punya .length
Generic interface:
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
type UserResponse = ApiResponse<{ nama: string; umur: number }>;