Tipe Kondisional TypeScript

Tipe kondisional dalam TypeScript menyediakan cara untuk membuat tipe yang bergantung pada suatu kondisi. Tipe kondisional memungkinkan fleksibilitas dan ekspresi yang lebih besar dalam definisi tipe, sehingga memungkinkan pemodelan hubungan tipe yang kompleks dengan cara yang jelas dan ringkas. Artikel ini membahas cara kerja tipe kondisional dalam TypeScript dan memberikan contoh untuk mengilustrasikan penggunaannya.

Apa itu Tipe Kondisional?

Tipe kondisional memungkinkan pembuatan tipe yang dipilih berdasarkan suatu kondisi. Tipe kondisional serupa dengan pernyataan kondisional dalam pemrograman tetapi beroperasi pada tingkat tipe. Sintaks dasar tipe kondisional adalah:

type ConditionalType = T extends U ? X : Y;

Dalam sintaksis ini:

  • T adalah tipe yang sedang diperiksa.
  • U adalah tipe yang akan dibandingkan.
  • X adalah tipe yang dikembalikan jika T memperluas U.
  • Y adalah tipe yang dikembalikan jika T tidak memperluas U.

Contoh Dasar Tipe Kondisional

Berikut adalah contoh sederhana dari tipe kondisional yang mengembalikan tipe berbeda berdasarkan apakah tipe yang diberikan adalah string atau bukan:

type IsString = T extends string ? "String" : "Not a string";

type Result1 = IsString;  // Result1 is "String"
type Result2 = IsString;  // Result2 is "Not a string"

Dalam contoh ini, IsString memeriksa apakah T memperluas string. Jika demikian, hasilnya adalah "String"; jika tidak, hasilnya adalah "Not a string".

Menggunakan Tipe Kondisional dengan Tipe Generik

Tipe kondisional juga dapat digunakan dengan tipe generik untuk membuat definisi tipe yang lebih fleksibel dan dapat digunakan kembali. Misalnya, tipe yang mengekstrak tipe pengembalian suatu fungsi:

type ReturnType = T extends (...args: any[]) => infer R ? R : never;

type FunctionType = (x: number) => string;

type Result = ReturnType;  // Result is string

Dalam contoh ini, ReturnType menggunakan kata kunci infer untuk menyimpulkan tipe pengembalian R dari tipe fungsi T. Jika T adalah tipe fungsi, ReturnType akan menjadi tipe pengembalian; jika tidak, defaultnya adalah never.

Tipe Kondisional dengan Tipe Union

Tipe kondisional juga dapat bekerja dengan tipe gabungan untuk menangani beberapa tipe yang mungkin. Misalnya, membedakan antara anggota gabungan yang berbeda:

type ExtractString = T extends string ? T : never;

type UnionType = string | number | boolean;

type Result = ExtractString;  // Result is string

Dalam contoh ini, ExtractString mengekstrak string dari tipe gabungan UnionType, yang menghasilkan string.

Tipe Kondisional dengan Pemetaan Tipe

Tipe kondisional dapat digabungkan dengan pemetaan tipe untuk membuat transformasi tipe yang lebih kompleks. Misalnya, pemetaan pada serangkaian tipe untuk menerapkan tipe kondisional:

type MapArray = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type ArrayType = [string, number, boolean];

type MappedArray = MapArray;  // MappedArray is [string, never, never]

Dalam contoh ini, MapArray memetakan setiap elemen array T dan menerapkan tipe kondisional ke setiap elemen, menghasilkan array di mana hanya elemen string yang dipertahankan.

Kesimpulan

Tipe kondisional dalam TypeScript merupakan alat yang ampuh untuk membuat definisi tipe yang fleksibel dan ekspresif. Dengan memanfaatkan tipe kondisional, pengembang dapat memodelkan hubungan tipe yang kompleks, menangani berbagai skenario, dan meningkatkan keamanan tipe dalam kode TypeScript mereka. Memahami cara menggunakan tipe kondisional secara efektif dapat meningkatkan kemampuan untuk menulis kode TypeScript yang tangguh dan dapat dipelihara secara signifikan.