diff --git a/src/common/spec.ts b/src/common/spec.ts index 8adbb24..eb8791d 100644 --- a/src/common/spec.ts +++ b/src/common/spec.ts @@ -39,10 +39,8 @@ export type AnyApiEndpoints = { [Path in string]: AnyApiEndpoint }; export interface BaseApiSpec< Params, - // eslint-disable-next-line @typescript-eslint/no-explicit-any Query, Body, - // eslint-disable-next-line @typescript-eslint/no-explicit-any RequestHeaders, Responses extends AnyApiResponses, > { @@ -60,7 +58,8 @@ export type ApiSpec< >, // eslint-disable-next-line @typescript-eslint/no-explicit-any Query extends Record = Record, - Body extends object = object, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Body extends Record | string = Record | string, RequestHeaders extends Record = Record, Responses extends AnyApiResponses = AnyApiResponses, > = BaseApiSpec; @@ -90,7 +89,7 @@ export type ApiP< > = E[Path] extends ApiEndpoint ? E[Path][M] extends ApiSpec> ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - E[Path][M][P] extends Record + E[Path][M][P] extends Record | string ? E[Path][M][P] : undefined : undefined diff --git a/src/fetch/index.t-test.ts b/src/fetch/index.t-test.ts index 6537893..94c76c9 100644 --- a/src/fetch/index.t-test.ts +++ b/src/fetch/index.t-test.ts @@ -173,6 +173,21 @@ const JSONT = JSON as JSONT; })(); } +{ + type Spec = DefineApiEndpoints<{ + "/users": { + post: { + body: string; + responses: { 200: { body: string } }; + }; + }; + }>; + (async () => { + const f = fetch as FetchT<"", Spec>; + await f(`/users`, { method: "post", body: "some string" }); + })(); +} + { type Spec = DefineApiEndpoints<{ "/packages/list": { diff --git a/src/fetch/index.ts b/src/fetch/index.ts index 42ab75e..2f49d02 100644 --- a/src/fetch/index.ts +++ b/src/fetch/index.ts @@ -20,8 +20,8 @@ import { TypedString } from "../json"; export type RequestInitT< InputMethod extends CaseInsensitiveMethod, // eslint-disable-next-line @typescript-eslint/no-explicit-any - Body extends Record | undefined, - HeadersObj extends Record | undefined, + Body extends Record | string | undefined, + HeadersObj extends string | Record | undefined, > = Omit & (InputMethod extends "get" | "GET" ? { method?: InputMethod } @@ -31,8 +31,10 @@ export type RequestInitT< ? IsAllOptional extends true ? { body?: Body | TypedString } : { body: TypedString } - : // eslint-disable-next-line @typescript-eslint/ban-types - {}) & + : Body extends string + ? { body: string } + : // eslint-disable-next-line @typescript-eslint/ban-types + {}) & (HeadersObj extends Record ? IsAllOptional extends true ? { headers?: HeadersObj | Headers }