Pemrograman

TypeScript di 2026: Fitur-Fitur yang Wajib Kamu Pakai

TypeScript bukan sekadar JavaScript dengan tipe data. Di 2026, TypeScript sudah menjadi bahasa utama di hampir semua project front-end dan back-end serius. Berikut fitur-fitur yang paling berguna dan sering dipakai tim profesional.

1. Satisfies Operator

satisfies memvalidasi bahwa sebuah value cocok dengan tipe tertentu, tanpa mengubah tipe inferensi-nya:

type Warna = "merah" | "hijau" | "biru";
type Palette = { [k: string]: Warna | Warna[] };

const palette = {
  merah: "merah",
  hijau: ["hijau", "biru"],
  primer: "merah",
} satisfies Palette;

// TypeScript tetap tahu bahwa palette.hijau adalah array
palette.hijau.map(w => w.toUpperCase()); // OK!

2. Template Literal Types

Buat tipe dari kombinasi string — sangat berguna untuk event name, route, dll:

type Method = "GET" | "POST" | "PUT" | "DELETE";
type Endpoint = "/users" | "/posts" | "/comments";

type Route = `${Method} ${Endpoint}`;
// "GET /users" | "GET /posts" | "POST /users" | ... dst.

function request(route: Route): Promise<unknown> {
  const [method, path] = route.split(" ");
  return fetch(path, { method });
}

request("GET /users");   // OK
request("PATCH /users"); // Error: tipe tidak cocok

3. Discriminated Union yang Rapi

Pola ini membuat penanganan berbagai state jadi type-safe:

type ApiState<T> =
  | { status: "loading" }
  | { status: "success"; data: T }
  | { status: "error"; pesan: string };

function render<T>(state: ApiState<T>): string {
  switch (state.status) {
    case "loading":
      return "Memuat...";
    case "success":
      return `Data: ${JSON.stringify(state.data)}`;
    case "error":
      return `Error: ${state.pesan}`;
  }
}

4. Mapped Types dan Utility Types Lanjutan

// Buat semua properti menjadi nullable
type Nullable<T> = { [K in keyof T]: T[K] | null };

// Buat versi "patch" (semua opsional) dari sebuah tipe
type Patch<T> = Partial<Pick<T, keyof T>>;

interface User {
  id: number;
  nama: string;
  email: string;
}

type UserUpdate = Patch<User>;
// { id?: number; nama?: string; email?: string; }

5. infer dalam Conditional Types

// Ambil tipe kembalian dari fungsi async
type AwaitedReturn<T extends (...args: any[]) => Promise<any>> =
  T extends (...args: any[]) => Promise<infer R> ? R : never;

async function ambilUser(): Promise<{ id: number; nama: string }> {
  return { id: 1, nama: "Budi" };
}

type HasilUser = AwaitedReturn<typeof ambilUser>;
// { id: number; nama: string }

6. Konfigurasi tsconfig.json yang Ketat

{
  "compilerOptions": {
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,
    "noImplicitOverride": true,
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext"
  }
}

noUncheckedIndexedAccess sangat berguna — akses array arr[0] sekarang bertipe string | undefined, sehingga kamu dipaksa mengecek undefined sebelum pakai.

Penutup

TypeScript di 2026 bukan sekadar pelengkap — ia adalah fondasi. Semakin kamu memanfaatkan sistem tipenya, semakin sedikit bug yang lolos ke production.

0 Komentar

Komentar ditinjau dulu sebelum tampil.