Typescript Generics Constraints Default Type Parameters Conditional Return Types
Definisi
Generics di TypeScript memungkinkan tipe mengikuti argumen secara aman. Constraint membatasi tipe yang diterima, default type parameter memberi nilai bawaan bila tidak diisi, dan conditional return type membuat tipe kembalian bergantung pada input.
Kapan dipakai
- Constraint (
T extends X): butuh akses ke property/method tertentu di dalam fungsi generic. - Default param (
T = Default): mayoritas pemakaian punya tipe umum, tapi tetap ingin fleksibel. - Conditional return (
T extends X ? A : B): perilaku berbeda berdasar bentuk input (misal fungsi yang mengembalikanPromisekalau async).
Cara kerja
Constraint
function longest<T extends { length: number }>(a: T, b: T): T {
return a.length >= b.length ? a : b;
}Tanpa extends { length: number }, a.length tidak diketahui compiler.
Default type parameter
interface ApiClient<T = unknown> {
get(id: string): Promise<T>;
}
type UserClient = ApiClient<User>; // T = User
type RawClient = ApiClient; // T = unknownConditional return type
type Result<T> = T extends string
? { kind: 'text'; value: string }
: { kind: 'other'; value: T };
function wrap<T>(input: T): Result<T> {
if (typeof input === 'string') {
return { kind: 'text', value: input } as Result<T>;
}
return { kind: 'other', value: input } as Result<T>;
}Struktur alur
Loading diagram...
Contoh helper dengan ketiganya
function coerce<T extends string | number = string>(
input: unknown
): T {
return (String(input) as unknown) as T;
}Catatan implementasi
- Constraint sebaiknya sesedikit mungkin: jangan
T extends VerySpecifickalau cukup{ id: string }. - Default param berguna agar caller tidak perlu menulis tipe berulang untuk kasus umum.
- Conditional return perlu
asdi implementasi karena TS belum selalu bisa menyempitkan branch secara otomatis; pastikan runtime cocok dengan tipe.
Kesalahan umum
- Constraint terlalu ketat: menolak tipe valid yang sebenarnya bisa dipakai.
- Lupa default sehingga caller dipaksa menulis tipe di setiap pemanggilan.
- Conditional return tidak sinkron runtime: tipe bilang
Atapi kode mengembalikanB(butuh runtime check + assertion benar). - Over-narrowing:
T extends X ? A : Bjadi sulit dibaca kalau terlalu bersarang.