Skip to content

Commit 0bf074a

Browse files
authored
Merge pull request #4723 from reduxjs/retry-meta-types
Allow passing meta to retry.fail, and passing baseQuery to ensure types match
2 parents c87a59a + 2f9e318 commit 0bf074a

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ jobs:
111111
fail-fast: false
112112
matrix:
113113
node: ['20.x']
114-
ts: ['4.7', '4.8', '4.9', '5.0', '5.1', '5.2', '5.3', '5.4', '5.5']
114+
ts: ['5.0', '5.1', '5.2', '5.3', '5.4', '5.5']
115115
steps:
116116
- name: Checkout repo
117117
uses: actions/checkout@v4

docs/rtk-query/usage/customizing-queries.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ const staggeredBaseQueryWithBailOut = retry(
636636
// bail out of re-tries immediately if unauthorized,
637637
// because we know successive re-retries would be redundant
638638
if (result.error?.status === 401) {
639-
retry.fail(result.error)
639+
retry.fail(result.error, result.meta)
640640
}
641641

642642
return result

packages/toolkit/src/query/retry.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
BaseQueryError,
66
BaseQueryExtraOptions,
77
BaseQueryFn,
8+
BaseQueryMeta,
89
} from './baseQueryTypes'
910
import type { FetchBaseQueryError } from './fetchBaseQuery'
1011
import { HandledError } from './HandledError'
@@ -64,8 +65,11 @@ export type RetryOptions = {
6465
}
6566
)
6667

67-
function fail(e: any): never {
68-
throw Object.assign(new HandledError({ error: e }), {
68+
function fail<BaseQuery extends BaseQueryFn = BaseQueryFn>(
69+
error: BaseQueryError<BaseQuery>,
70+
meta?: BaseQueryMeta<BaseQuery>,
71+
): never {
72+
throw Object.assign(new HandledError({ error, meta }), {
6973
throwImmediately: true,
7074
})
7175
}

packages/toolkit/src/query/tests/retry.test-d.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import type { RetryOptions } from '@internal/query/retry'
1+
import { retry, type RetryOptions } from '@internal/query/retry'
2+
import {
3+
fetchBaseQuery,
4+
type FetchBaseQueryError,
5+
type FetchBaseQueryMeta,
6+
} from '@internal/query/fetchBaseQuery'
27

38
describe('type tests', () => {
49
test('RetryOptions only accepts one of maxRetries or retryCondition', () => {
@@ -14,6 +19,28 @@ describe('type tests', () => {
1419
retryCondition: () => false,
1520
}).not.toMatchTypeOf<RetryOptions>()
1621
})
17-
})
22+
test('fail can be pretyped to only accept correct error and meta', () => {
23+
expectTypeOf(retry.fail).parameter(0).toEqualTypeOf<unknown>()
24+
expectTypeOf(retry.fail).parameter(1).toEqualTypeOf<{} | undefined>()
25+
expectTypeOf(retry.fail).toBeCallableWith('Literally anything', {})
26+
27+
const myBaseQuery = fetchBaseQuery()
28+
const typedFail = retry.fail<typeof myBaseQuery>
29+
30+
expectTypeOf(typedFail).parameter(0).toMatchTypeOf<FetchBaseQueryError>()
31+
expectTypeOf(typedFail)
32+
.parameter(1)
33+
.toMatchTypeOf<FetchBaseQueryMeta | undefined>()
1834

19-
export {}
35+
expectTypeOf(typedFail).toBeCallableWith(
36+
{
37+
status: 401,
38+
data: 'Unauthorized',
39+
},
40+
{ request: new Request('http://localhost') },
41+
)
42+
43+
expectTypeOf(typedFail).parameter(0).not.toMatchTypeOf<string>()
44+
expectTypeOf(typedFail).parameter(1).not.toMatchTypeOf<{}>()
45+
})
46+
})

0 commit comments

Comments
 (0)