Skip to content

Commit 6742578

Browse files
authored
feat(core): add generic type support to useDataProvider (#7448)
1 parent 779d52a commit 6742578

3 files changed

Lines changed: 33 additions & 4 deletions

File tree

‎.changeset/tricky-eggs-destroy.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@refinedev/core": minor
3+
---
4+
5+
Add generic type support to `useDataProvider` so custom data providers keep their assigned types when accessed through the hook.
6+
7+
This is a type-only improvement. Existing runtime behavior is unchanged, and consumers can opt into the stronger type by passing a generic argument when calling `useDataProvider`.

‎packages/core/src/hooks/data/useDataProvider.spec.tsx‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
import { renderHook } from "@testing-library/react";
22

33
import { MockJSONServer, TestWrapper } from "@test";
4+
import type { BaseKey, DataProvider, GetOneParams } from "@refinedev/core";
45

56
import { useDataProvider } from ".";
67

8+
type CustomDataProvider = Omit<DataProvider, "getOne"> & {
9+
getOne: (params: {
10+
resource: string;
11+
id: BaseKey;
12+
meta?: { test?: string } & GetOneParams["meta"];
13+
}) => ReturnType<DataProvider["getOne"]>;
14+
};
15+
716
describe("useDataProvider Hook", () => {
817
const { result } = renderHook(() => useDataProvider(), {
918
wrapper: TestWrapper({
@@ -25,6 +34,16 @@ describe("useDataProvider Hook", () => {
2534
expect(dataProvider.getList).toBeDefined();
2635
});
2736

37+
it("preserves custom provider types when generic is provided", async () => {
38+
const dataProvider = result.current<CustomDataProvider>();
39+
40+
await dataProvider.getOne({
41+
resource: "posts",
42+
id: 1,
43+
meta: { test: "typed" },
44+
});
45+
});
46+
2847
it("get list with from second data provider", async () => {
2948
try {
3049
result.current("not-exist");

‎packages/core/src/hooks/data/useDataProvider.tsx‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import { useCallback, useContext } from "react";
22

33
import { DataContext } from "@contexts/data";
4-
import { type DataProvider, IDataContext } from "../../contexts/data/types";
5-
export const useDataProvider = (): ((
4+
import type { DataProvider } from "../../contexts/data/types";
5+
6+
export const useDataProvider = <
7+
TDataProvider extends DataProvider = DataProvider,
8+
>(): ((
69
/**
710
* The name of the `data provider` you want to access
811
*/
912
dataProviderName?: string,
10-
) => DataProvider) => {
13+
) => TDataProvider) => {
1114
const context = useContext(DataContext);
1215

1316
const handleDataProvider = useCallback(
@@ -36,7 +39,7 @@ export const useDataProvider = (): ((
3639
);
3740
},
3841
[context],
39-
);
42+
) as (dataProviderName?: string) => TDataProvider;
4043

4144
return handleDataProvider;
4245
};

0 commit comments

Comments
 (0)