Skip to content

Commit a6e5977

Browse files
authored
Merge pull request #11170 from marmelab/Fix-withLifecycleCallback-return-type
[TypeScript] Fix withLifecycleCallback return type for augmented data providers
2 parents 7c23e27 + 07b3e46 commit a6e5977

3 files changed

Lines changed: 28 additions & 19 deletions

File tree

examples/crm/src/providers/fakerest/dataProvider.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,9 @@ const dataProviderWithCustomMethod = {
170170
id: Identifier,
171171
data: Partial<Omit<SalesFormData, 'password'>>
172172
): Promise<Partial<Omit<SalesFormData, 'password'>>> {
173-
const { data: previousData } = await dataProvider.getOne<Sale>(
174-
'sales',
175-
{
176-
id,
177-
}
178-
);
173+
const { data: previousData } = await dataProvider.getOne('sales', {
174+
id,
175+
});
179176

180177
if (!previousData) {
181178
throw new Error('User not found');
@@ -186,10 +183,10 @@ const dataProviderWithCustomMethod = {
186183
data,
187184
previousData,
188185
});
189-
return sale;
186+
return sale as Sale;
190187
},
191188
async isInitialized(): Promise<boolean> {
192-
const sales = await dataProvider.getList<Sale>('sales', {
189+
const sales = await dataProvider.getList('sales', {
193190
filter: {},
194191
pagination: { page: 1, perPage: 1 },
195192
sort: { field: 'id', order: 'ASC' },
@@ -204,12 +201,9 @@ const dataProviderWithCustomMethod = {
204201
if (!currentUser) {
205202
throw new Error('User not found');
206203
}
207-
const { data: previousData } = await dataProvider.getOne<Sale>(
208-
'sales',
209-
{
210-
id: currentUser.id,
211-
}
212-
);
204+
const { data: previousData } = await dataProvider.getOne('sales', {
205+
id: currentUser.id,
206+
});
213207

214208
if (!previousData) {
215209
throw new Error('User not found');
@@ -231,7 +225,7 @@ async function updateCompany(
231225
companyId: Identifier,
232226
updateFn: (company: Company) => Partial<Company>
233227
) {
234-
const { data: company } = await dataProvider.getOne<Company>('companies', {
228+
const { data: company } = await dataProvider.getOne('companies', {
235229
id: companyId,
236230
});
237231

@@ -244,7 +238,7 @@ async function updateCompany(
244238
});
245239
}
246240

247-
export const dataProvider = withLifecycleCallbacks(
241+
export const dataProvider: CrmDataProvider = withLifecycleCallbacks(
248242
withSupabaseFilterAdapter(dataProviderWithCustomMethod),
249243
[
250244
{

packages/ra-core/src/dataProvider/withLifecycleCallbacks.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,21 @@ describe('withLifecycleCallbacks', () => {
5252
dataProvider.getMany('posts', { ids: [1, 2] });
5353
expect(resourceCallback.beforeGetMany).toHaveBeenCalled();
5454
});
55+
it('should return the right type for augmented Data Providers', async () => {
56+
const dataProvider = withLifecycleCallbacks(
57+
{
58+
...testDataProvider(),
59+
getFoo: async () => 'foo',
60+
},
61+
[
62+
{
63+
resource: 'posts',
64+
beforeGetOne: jest.fn(params => Promise.resolve(params)),
65+
},
66+
]
67+
);
68+
expect(dataProvider.getFoo).toBeDefined();
69+
});
5570

5671
describe('beforeGetList', () => {
5772
it('should update the getList parameters', async () => {

packages/ra-core/src/dataProvider/withLifecycleCallbacks.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ import {
119119
* ]
120120
* );
121121
*/
122-
export const withLifecycleCallbacks = (
123-
dataProvider: DataProvider,
122+
export const withLifecycleCallbacks = <T extends DataProvider = DataProvider>(
123+
dataProvider: T,
124124
handlers: ResourceCallbacks[]
125-
): DataProvider => {
125+
): T => {
126126
return {
127127
...dataProvider,
128128

0 commit comments

Comments
 (0)