diff --git a/packages/swr-openapi/src/__test__/types.test-d.ts b/packages/swr-openapi/src/__test__/types.test-d.ts index 1ea997c36..b3a16420b 100644 --- a/packages/swr-openapi/src/__test__/types.test-d.ts +++ b/packages/swr-openapi/src/__test__/types.test-d.ts @@ -336,6 +336,52 @@ describe("types", () => { }); }); }); + + describe("custom error types", () => { + const uniqueKey = ""; + type Key = typeof uniqueKey; + const useQuery = createQueryHook(client, uniqueKey); + const useImmutable = createImmutableHook(client, uniqueKey); + const useInfinite = createInfiniteHook(client, uniqueKey); + + describe("useQuery", () => { + it("returns correct error", () => { + const { error } = useQuery("/pet/{petId}", { + params: { + path: { + petId: 5, + }, + }, + }); + + expectTypeOf(error).toEqualTypeOf(); + }); + }); + + describe("useImmutable", () => { + it("returns correct error", () => { + const { error } = useImmutable("/pet/{petId}", { + params: { + path: { + petId: 5, + }, + }, + }); + + expectTypeOf(error).toEqualTypeOf(); + }); + }); + + describe("useInfinite", () => { + it("returns correct error", () => { + const { error } = useInfinite("/pet/findByStatus", (_index, _prev) => ({ + params: { query: { status: "available" } }, + })); + + expectTypeOf(error).toEqualTypeOf(); + }); + }); + }); }); describe("TypesForRequest", () => { diff --git a/packages/swr-openapi/src/infinite.ts b/packages/swr-openapi/src/infinite.ts index 4ad7fdb88..c17584c30 100644 --- a/packages/swr-openapi/src/infinite.ts +++ b/packages/swr-openapi/src/infinite.ts @@ -33,16 +33,18 @@ import { useCallback, useDebugValue } from "react"; * }); * ``` */ -export function createInfiniteHook( - client: Client, - prefix: Prefix, -) { +export function createInfiniteHook< + Paths extends {}, + IMediaType extends MediaType, + Prefix extends string, + FetcherError = never, +>(client: Client, prefix: Prefix) { return function useInfinite< Path extends PathsWithMethod, R extends TypesForGetRequest, Init extends R["Init"], Data extends R["Data"], - Error extends R["Error"], + Error extends R["Error"] | FetcherError, Config extends SWRInfiniteConfiguration, >(path: Path, getInit: SWRInfiniteKeyLoader, config?: Config) { type Key = [Prefix, Path, Init | undefined] | null; diff --git a/packages/swr-openapi/src/query-base.ts b/packages/swr-openapi/src/query-base.ts index 234101842..bf6ff3d88 100644 --- a/packages/swr-openapi/src/query-base.ts +++ b/packages/swr-openapi/src/query-base.ts @@ -8,16 +8,18 @@ import { useCallback, useDebugValue, useMemo } from "react"; * @private */ export function configureBaseQueryHook(useHook: SWRHook) { - return function createQueryBaseHook( - client: Client, - prefix: Prefix, - ) { + return function createQueryBaseHook< + Paths extends {}, + IMediaType extends MediaType, + Prefix extends string, + FetcherError = never, + >(client: Client, prefix: Prefix) { return function useQuery< Path extends PathsWithMethod, R extends TypesForGetRequest, Init extends R["Init"], Data extends R["Data"], - Error extends R["Error"], + Error extends R["Error"] | FetcherError, Config extends R["SWRConfig"], >( path: Path,