Lompati ke konten utama
Modul 3 · Pelajaran 2 dari 26/14 dalam kursus~15 min
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:

TS
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:

TS
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:

TS
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):

TS
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):

TS
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

Latihan#ts.m3.l2.e1
Upaya: 0Memuat…

Selesaikan fungsi identitas generik sehingga menerima parameter nilai tipe generik T dan mengembalikannya tanpa modifikasi.

Memuat editor…
Tunjukkan petunjuk

Tipe yang dikembalikan harus sama dengan tipe umum T dengan parameternya.

Solusi tersedia setelah 3 upaya

Latihan 2: Pembungkus Kotak Generik

Latihan#ts.m3.l2.e2
Upaya: 0Memuat…

Definisikan antarmuka umum bernama Box yang menerima parameter tipe T dan memiliki properti tunggal bernama konten tipe T.

Memuat editor…
Tunjukkan petunjuk

Gunakan antarmuka Kotak<T> { konten: T; } sintaksis.

Solusi tersedia setelah 3 upaya

Latihan 3: Batasan Umum

Latihan#ts.m3.l2.e3
Upaya: 0Memuat…

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.

Memuat editor…
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

Latihan#ts.m3.l2.e4
Upaya: 0Memuat…

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>.

Memuat editor…
Tunjukkan petunjuk

Gunakan sintaksis untuk dua parameter umum Pair<T, U> dan tentukan makePair yang sesuai.

Solusi tersedia setelah 3 upaya