TypeScript punya fitur type-level programming yang powerful untuk transformasi type.
Mapped Types — membuat type baru dari type yang sudah ada:
type Optional<T> = { [K in keyof T]?: T[K] }
// Membuat semua property jadi optional
Conditional Types — type yang bergantung pada kondisi:
type IsString<T> = T extends string ? "yes" : "no"
type A = IsString<string> // "yes"
type B = IsString<number> // "no"
Template Literal Types — manipulasi string di level type:
type Event = "click" | "focus"
type Handler = `on${Capitalize<Event>}` // "onClick" | "onFocus"
as const — membuat value menjadi literal type (readonly):
const colors = ["merah", "biru"] as const
// type: readonly ["merah", "biru"], bukan string[]
satisfies — validasi type tanpa mempersempit:
const config = {
warna: "merah",
ukuran: 42,
} satisfies Record<string, string | number>
// config.warna tetap type "merah" (bukan string)
Tips:
as const+satisfiesadalah combo yang sangat berguna untuk konfigurasi yang type-safe.