Learn
← Previous Next →

Hari 16: Type-Safe API Client

65 min Last updated 09 Apr 2026

Membangun API Client yang Type-Safe

// Definisi tipe endpoint API
type ApiEndpoints = {
    "GET /users":           { params: never; response: User[] };
    "GET /users/:id":       { params: { id: number }; response: User };
    "POST /users":          { params: never; body: Omit; response: User };
    "PUT /users/:id":       { params: { id: number }; body: Partial; response: User };
    "DELETE /users/:id":    { params: { id: number }; response: { deleted: true } };
};

type Method = "GET" | "POST" | "PUT" | "DELETE";
type Endpoint = keyof ApiEndpoints;

// Type-safe fetch wrapper
async function apiRequest(
    endpoint: E,
    options?: {
        params?: ApiEndpoints[E] extends { params: infer P } ? P : never;
        body?: ApiEndpoints[E] extends { body: infer B } ? B : never;
    }
): Promise {
    // implementasi fetch...
    throw new Error("Tidak diimplementasikan dalam latihan ini");
}

💡 Notice: -? dalam mapped type menghapus optionality. RequiredKeys<T> menghasilkan union semua key yang required.

Assignment

Buat type-safe configurasi objek. Config<T> memastikan semua key dari T hadir di konfigurasi. Buat validator yang cek apakah semua required field ada.

Expected output:

Valid: true
Missing: none
TS index.ts
Solution
Output