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