Pelajaran modul (2/2)
Generik Dasar
Generik (pemrograman generik) adalah salah satu fitur paling canggih dari TypeScript. Mereka memungkinkan Anda menulis komponen, fungsi, dan antarmuka yang fleksibel dan dapat digunakan kembali yang dapat bekerja dengan tipe data berbeda dengan tetap menjaga keamanan tipe maksimum dan menghindari penggunaan any.
Fungsi Generik
Bayangkan generik sebagai variabel untuk tipe. Mari pertimbangkan fungsi yang mengembalikan nilai yang diteruskan ke fungsi tersebut sebagai argumen:
function identity<T>(arg: T): T {
return arg;
}Huruf T (kependekan dari Type) adalah pengganti tipe tersebut. Saat kita memanggil identity, TypeScript menangkap tipe argumen yang diteruskan dan secara otomatis menyetel T ke tipe tersebut:
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)Antarmuka Generik dan Alias
Generik juga dapat diterapkan pada antarmuka dan mengetikkan alias untuk mendefinisikan wadah umum atau struktur data:
interface Box<T> {
content: T;
}
const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };Beberapa Parameter Tipe
Kita dapat mendefinisikan fungsi atau tipe yang menggunakan beberapa variabel tipe (misalnya, T dan U):
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}Batasan Umum
Terkadang kita ingin membatasi tipe yang diterima oleh obat generik. Kita dapat menggunakan kata kunci extends untuk menambahkan batasan.
Misalnya, jika kita ingin tipe generik selalu memiliki properti length (seperti string atau array):
interface HasLength {
length: number;
}
function logLength<T extends HasLength>(arg: T): void {
console.log(arg.length); // Safe! We know arg has 'length'
}
logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!Cobalah sendiri
Latihan 1: Fungsi Identitas Generik
Selesaikan fungsi identitas generik sehingga menerima parameter nilai tipe generik T dan mengembalikannya tanpa modifikasi.
Tunjukkan petunjuk
Tipe yang dikembalikan harus sama dengan tipe umum T dengan parameternya.
Solusi tersedia setelah 3 upaya
Latihan 2: Pembungkus Kotak Generik
Definisikan antarmuka umum bernama Box yang menerima parameter tipe T dan memiliki properti tunggal bernama konten tipe T.
Tunjukkan petunjuk
Gunakan antarmuka Kotak<T> { konten: T; } sintaksis.
Solusi tersedia setelah 3 upaya
Latihan 3: Batasan Umum
Tulis fungsi generik bernama getLength yang menerima parameter arg. arg harus dibatasi pada antarmuka yang memiliki properti panjang (angka). Fungsi tersebut harus mengembalikan arg.length.
Tunjukkan petunjuk
Deklarasikan fungsi sebagai getLength<T extends HasLength>(arg: T): number dan kembalikan arg.length.
Solusi tersedia setelah 3 upaya
Latihan 4: Pasangan Generik
Definisikan antarmuka generik Pair<T, U> dengan dua properti: yang pertama bertipe T dan yang kedua bertipe U. Selanjutnya, buat fungsi generik makePair yang menerima properti pertama (tipe T) dan kedua (tipe U) dan mengembalikan objek yang mengimplementasikan Pair<T, U>.
Tunjukkan petunjuk
Gunakan sintaksis untuk dua parameter umum Pair<T, U> dan tentukan makePair yang sesuai.
Solusi tersedia setelah 3 upaya