Skip to content

Commit 50afabe

Browse files
committed
add throwErrorsFromPromise helper
1 parent 5f7afe9 commit 50afabe

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

etc/redux-toolkit.api.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@ export function createAsyncThunk<ActionType extends string, Returned, ActionPara
121121
args: ActionParams;
122122
requestId: string;
123123
}>;
124+
unwrapResult: (returned: import("./createAction").PayloadAction<Returned, string, {
125+
args: ActionParams;
126+
requestId: string;
127+
}, never> | import("./createAction").PayloadAction<undefined, string, {
128+
args: ActionParams;
129+
requestId: string;
130+
}, Error>) => Returned;
124131
};
125132

126133
// @alpha (undocumented)

src/createAsyncThunk.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { Dispatch } from 'redux'
22
import nanoid from 'nanoid'
33
import { createAction } from './createAction'
44

5+
type Await<P> = P extends PromiseLike<infer T> ? T : P
6+
57
type AsyncThunksArgs<S, E, D extends Dispatch = Dispatch> = {
68
dispatch: D
79
getState: S
@@ -129,5 +131,19 @@ export function createAsyncThunk<
129131
}
130132
}
131133

132-
return Object.assign(actionCreator, { pending, rejected, fulfilled })
134+
function unwrapResult(
135+
returned: Await<ReturnType<ReturnType<typeof actionCreator>>>
136+
) {
137+
if (rejected.match(returned)) {
138+
throw returned.error
139+
}
140+
return returned.payload
141+
}
142+
143+
return Object.assign(actionCreator, {
144+
pending,
145+
rejected,
146+
fulfilled,
147+
unwrapResult
148+
})
133149
}

type-tests/files/createAsyncThunk.typetest.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createAsyncThunk, Dispatch, createReducer, AnyAction } from 'src'
22
import { ThunkDispatch } from 'redux-thunk'
3+
import { promises } from 'fs'
34

45
function expectType<T>(t: T) {
56
return t
@@ -29,7 +30,8 @@ function fn() {}
2930
})
3031
)
3132

32-
const result = await dispatch(async(3))
33+
const promise = dispatch(async(3))
34+
const result = await promise
3335

3436
if (async.fulfilled.match(result)) {
3537
expectType<ReturnType<typeof async['fulfilled']>>(result)
@@ -40,4 +42,15 @@ function fn() {}
4042
// typings:expect-error
4143
expectType<ReturnType<typeof async['fulfilled']>>(result)
4244
}
45+
46+
promise
47+
.then(async.unwrapResult)
48+
.then(result => {
49+
expectType<number>(result)
50+
// typings:expect-error
51+
expectType<Error>(result)
52+
})
53+
.catch(error => {
54+
// catch is always any-typed, nothing we can do here
55+
})
4356
})()

0 commit comments

Comments
 (0)