diff --git a/packages/ra-core/src/dataProvider/useDataProvider.ts b/packages/ra-core/src/dataProvider/useDataProvider.ts index 019b7d9d495..62bf87f434c 100644 --- a/packages/ra-core/src/dataProvider/useDataProvider.ts +++ b/packages/ra-core/src/dataProvider/useDataProvider.ts @@ -104,8 +104,11 @@ import { * // - FETCH_END */ const useDataProvider = < - TDataProvider extends DataProvider = DataProvider ->(): DataProviderProxy => { + TDataProvider extends DataProvider = DataProvider, + TDataProviderProxy extends DataProviderProxy< + TDataProvider + > = DataProviderProxy +>(): TDataProviderProxy => { const dispatch = useDispatch() as Dispatch; const dataProvider = ((useContext(DataProviderContext) || defaultDataProvider) as unknown) as TDataProvider; @@ -117,7 +120,7 @@ const useDataProvider = < const store = useStore(); const logoutIfAccessDenied = useLogoutIfAccessDenied(); - const dataProviderProxy = useMemo>(() => { + const dataProviderProxy = useMemo(() => { return new Proxy(dataProvider, { get: (target, name) => { if (typeof name === 'symbol') { @@ -217,7 +220,7 @@ const useDataProvider = < }); }, [dataProvider, dispatch, isOptimistic, logoutIfAccessDenied, store]); - return dataProviderProxy; + return (dataProviderProxy as unknown) as TDataProviderProxy; }; // get a Promise that resolves after a delay in milliseconds diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index 3de214bf032..538120ffcd8 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -229,15 +229,15 @@ export type DataProviderResult = // This generic function type extracts the parameters of the function passed as its DataProviderMethod generic parameter. // It returns another function with the same parameters plus an optional options parameter used by the useDataProvider hook to specify side effects. // The returned function has the same result type as the original -type DataProviderProxyMethod = DataProviderMethod extends ( - ...a: any[] -) => infer Result +type DataProviderProxyMethod< + TDataProviderMethod +> = TDataProviderMethod extends (...a: any[]) => infer Result ? ( // This strange spread usage is required for two reasons // 1. It keeps the named parameters of the original function // 2. It allows to add an optional options parameter as the LAST parameter ...a: [ - ...Args: Parameters, + ...Args: Parameters, options?: UseDataProviderOptions ] ) => Result @@ -249,6 +249,46 @@ export type DataProviderProxy< [MethodKey in keyof TDataProvider]: DataProviderProxyMethod< TDataProvider[MethodKey] >; +} & { + getList: ( + resource: string, + params: GetListParams, + options?: UseDataProviderOptions + ) => Promise>; + + getOne: ( + resource: string, + params: GetOneParams, + options?: UseDataProviderOptions + ) => Promise>; + + getMany: ( + resource: string, + params: GetManyParams, + options?: UseDataProviderOptions + ) => Promise>; + + getManyReference: ( + resource: string, + params: GetManyReferenceParams, + options?: UseDataProviderOptions + ) => Promise>; + + update: ( + resource: string, + params: UpdateParams, + options?: UseDataProviderOptions + ) => Promise>; + + create: ( + resource: string, + params: CreateParams + ) => Promise>; + + delete: ( + resource: string, + params: DeleteParams + ) => Promise>; }; export type MutationMode = 'pessimistic' | 'optimistic' | 'undoable';