@@ -343,47 +343,62 @@ export type StatusCode = ${statusCodeType};
343343// Error handling types
344344export type TypedApiResponse<TSuccess, TAllResponses extends Record<string | number, unknown> = {}> =
345345 (keyof TAllResponses extends never
346- ? {
346+ ? Omit<Response, "ok" | "status" | "json"> & {
347347 ok: true;
348348 status: number;
349349 data: TSuccess;
350+ json: () => Promise<TSuccess>;
350351 }
351352 : {
352353 [K in keyof TAllResponses]: K extends string
353354 ? K extends \`\${infer TStatusCode extends number}\`
354355 ? TStatusCode extends StatusCode
355- ? {
356+ ? Omit<Response, "ok" | "status" | "json"> & {
356357 ok: true;
357358 status: TStatusCode;
358- data: TAllResponses[K];
359+ data: TSuccess;
360+ json: () => Promise<TSuccess>;
359361 }
360- : {
362+ : Omit<Response, "ok" | "status" | "json"> & {
361363 ok: false;
362364 status: TStatusCode;
363- error: TAllResponses[K];
365+ data: TAllResponses[K];
366+ json: () => Promise<TAllResponses[K]>;
364367 }
365368 : never
366369 : K extends number
367370 ? K extends StatusCode
368- ? {
371+ ? Omit<Response, "ok" | "status" | "json"> & {
369372 ok: true;
370373 status: K;
371- data: TAllResponses[K];
374+ data: TSuccess;
375+ json: () => Promise<TSuccess>;
372376 }
373- : {
377+ : Omit<Response, "ok" | "status" | "json"> & {
374378 ok: false;
375379 status: K;
376- error: TAllResponses[K];
380+ data: TAllResponses[K];
381+ json: () => Promise<TAllResponses[K]>;
377382 }
378383 : never;
379384 }[keyof TAllResponses]);
380385
381386export type SafeApiResponse<TEndpoint> = TEndpoint extends { response: infer TSuccess; responses: infer TResponses }
382387 ? TResponses extends Record<string, unknown>
383388 ? TypedApiResponse<TSuccess, TResponses>
384- : { ok: true; status: number; data: TSuccess }
389+ : Omit<Response, "ok" | "status" | "json"> & {
390+ ok: true;
391+ status: number;
392+ data: TSuccess;
393+ json: () => Promise<TSuccess>;
394+ }
385395 : TEndpoint extends { response: infer TSuccess }
386- ? { ok: true; status: number; data: TSuccess }
396+ ? Omit<Response, "ok" | "status" | "json"> & {
397+ ok: true;
398+ status: number;
399+ data: TSuccess;
400+ json: () => Promise<TSuccess>;
401+ }
387402 : never;
388403
389404type RequiredKeys<T> = {
@@ -454,12 +469,17 @@ export class ApiClient {
454469 if (withResponse) {
455470 return this.fetcher("${ method } ", this.baseUrl + path, Object.keys(fetchParams).length ? fetchParams : undefined)
456471 .then(async (response) => {
472+ // Parse the response data
457473 const data = await this.parseResponse(response);
458- if (response.ok) {
459- return { ok: true, status: response.status, data };
460- } else {
461- return { ok: false, status: response.status, error: data };
462- }
474+
475+ // Override properties while keeping the original Response object
476+ const typedResponse = Object.assign(response, {
477+ ok: response.ok,
478+ status: response.status,
479+ data: data,
480+ json: () => Promise.resolve(data)
481+ });
482+ return typedResponse;
463483 });
464484 } else {
465485 return this.fetcher("${ method } ", this.baseUrl + path, requestParams)
@@ -530,9 +550,16 @@ export function createApiClient(fetcher: Fetcher, baseUrl?: string) {
530550 // With error handling
531551 const result = await api.get("/users/{id}", { path: { id: "123" }, withResponse: true });
532552 if (result.ok) {
533- console.log(result.data);
553+ // Access data directly
554+ const user = result.data;
555+ console.log(user);
556+
557+ // Or use the json() method for compatibility
558+ const userFromJson = await result.json();
559+ console.log(userFromJson);
534560 } else {
535- console.error(\`Error \${result.status}:\`, result.error);
561+ const error = result.data;
562+ console.error(\`Error \${result.status}:\`, error);
536563 }
537564*/
538565
0 commit comments