在redux-thunk中,我们可以定义什么类型的actions
可以dispatch
enum MoviesTypes {
ADD_MOVIES = 'ADD_MOVIES',
}
interface AddMoviesAction {
type: typeof MoviesTypes.ADD_MOVIES;
movies: MovieShowcase[];
}
type MoviesActionTypes =
| AddMoviesAction;
const addMovies = (movies: MovieShowcase[]): MoviesActionTypes => ({
type: MoviesTypes.ADD_MOVIES,
movies,
});
// ThunkAction<any, any, any, MoviesActionTypes> <---
// dispatch only actions inside MoviesActionTypes
const fetchNextPage = (
page: number
): ThunkAction<Promise<void>, {}, {}, MoviesActionTypes> => async (dispatch) => {
dispatch({ type: 'BAD_TYPE' }); // error
dispatch({ type: MoviesTypes.ADD_MOVIES, movies: [] }); // good
};
有可能对传奇做同样的事情吗?
我怎么能严格地说我们只能put
在内部调用动作MoviesActionTypes
?
function* fetchMovies({ page }: FetchMoviesAction) {
yield put({ type: MoviesTypes.ADD_MOVIES, movies: [] }); // good
yield put({ type: 'BAD_TYPE' }); // good
}
function* watchFetchMovies() {
yield takeEvery(MoviesTypes.FETCH_MOVIES, fetchMovies);
}
put
是通用的:
export function put<A extends Action>(action: A): PutEffect<A>
因此,只需编写一个put
受应用程序操作类型约束的版本:
import {
put as putUntyped,
} from "redux-saga/effects";
export const put = <A extends FetchMoviesAction>(action: A): PutEffect<A> =>
putUntyped(action);
然后在任何可能放置put的地方使用它:
import { put } from "...";
yield put({ type: MoviesTypes.ADD_MOVIES, movies: [] });
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句