Skip to content

Commit ffc9e6d

Browse files
committed
fix(openapi-react-query): mutation results type
1 parent 12f9c29 commit ffc9e6d

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

packages/openapi-react-query/src/index.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,16 @@ export type UseMutationMethod<Paths extends Record<string, Record<HttpMethod, {}
156156
Path extends PathsWithMethod<Paths, Method>,
157157
Init extends MaybeOptionalInit<Paths[Path], Method>,
158158
Response extends Required<FetchResponse<Paths[Path][Method], Init, Media>>, // note: Required is used to avoid repeating NonNullable in UseQuery types
159-
Options extends Omit<UseMutationOptions<Response["data"], Response["error"], Init>, "mutationKey" | "mutationFn">,
159+
TOnMutateResult = unknown,
160160
>(
161161
method: Method,
162162
url: Path,
163-
options?: Options,
163+
options?: Omit<
164+
UseMutationOptions<Response["data"], Response["error"], Init, TOnMutateResult>,
165+
"mutationKey" | "mutationFn"
166+
>,
164167
queryClient?: QueryClient,
165-
) => UseMutationResult<Response["data"], Response["error"], Init>;
168+
) => UseMutationResult<Response["data"], Response["error"], Init, TOnMutateResult>;
166169

167170
export interface OpenapiQueryClient<Paths extends {}, Media extends MediaType = MediaType> {
168171
queryOptions: QueryOptionsFunction<Paths, Media>;

packages/openapi-react-query/test/index.test.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,30 @@ describe("client", () => {
792792

793793
await waitFor(() => rendered.findByText("data: Hello, status: success"));
794794
});
795+
796+
it("should type mutate results properly", async () => {
797+
const fetchClient = createFetchClient<paths>({ baseUrl });
798+
const client = createClient(fetchClient);
799+
800+
const onMutateReturnValue = { someArray: [1, 2, 3], someString: "abc" };
801+
type expectedOnMutateResultType = typeof onMutateReturnValue | undefined;
802+
803+
const result = renderHook(
804+
() =>
805+
client.useMutation("put", "/comment", {
806+
onMutate: () => onMutateReturnValue,
807+
onError: (err, _, onMutateResult, context) => {
808+
assertType<expectedOnMutateResultType>(onMutateResult);
809+
},
810+
onSettled: (_data, _error, _variables, onMutateResult, context) => {
811+
assertType<expectedOnMutateResultType>(onMutateResult);
812+
},
813+
}),
814+
{ wrapper },
815+
);
816+
817+
assertType<expectedOnMutateResultType>(result.result.current.context);
818+
});
795819
});
796820

797821
describe("mutateAsync", () => {

0 commit comments

Comments
 (0)