- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试创建我的 mapDispatchToProps 函数时,我的容器组件遇到 typescript 错误,因为我的 Thunk 函数没有返回包含属性“Type”的对象。我的 Thunk 返回一个 Promise,它本身没有 'Type' 属性,但会调度一个里面有 'Type' 的 Action 。我不知道如何告诉 typescript 这没问题。
我得到的错误是
Argument of type '(dispatch: Dispatch<ActionTypes>, getState: () => IStoreState) => Promise<void>' is not assignable to parameter of type 'ActionTypes'.
Property 'type' is missing in type '(dispatch: Dispatch<ActionTypes>, getState: () => IStoreState) => Promise<void>'.
export interface IFetchJokeSuccessAction {
readonly type: ActionTypeKeys.FETCH_JOKE_SUCCESS;
readonly payload: string;
}
export interface IFetchJokeInProgressAction {
payload: string;
readonly type: ActionTypeKeys.FETCH_JOKE_INPROGRESS
}
export interface IFetchJokeFailAction {
readonly type: ActionTypeKeys.FETCH_JOKE_FAIL;
readonly payload: string;
}
export interface IClearJokeAction {
readonly type: ActionTypeKeys.CLEAR_JOKE
}
type ActionTypes = IFetchJokeSuccessAction | IFetchJokeInProgressAction | IFetchJokeFailAction | IClearJokeAction;
interface IDispatchProps {
clearJoke: () => any;
fetchJoke: () => any;
}
const mapDispatchToProps = (dispatch: Dispatch<ActionTypes>): IDispatchProps => {
return {
clearJoke: () => dispatch(clearJoke()), // No problem, this is a regular action
fetchJoke: () => dispatch(fetchJoke()) // Problem, this is a Thunk
}
};
import { Dispatch } from 'redux';
import { fetchJokeAPI } from '../api/jokeApi';
import IStoreState from '../store/IStoreState';
import { ActionTypeKeys as keys, ActionTypes, IClearJokeAction, IFetchJokeFailAction, IFetchJokeInProgressAction, IFetchJokeSuccessAction} from './ActionTypes';
export function fetchJoke(): (dispatch: Dispatch<ActionTypes>, getState: () => IStoreState) => Promise<void> {
return async (dispatch: Dispatch<IFetchJokeInProgressAction | IFetchJokeSuccessAction | IFetchJokeFailAction>, getState: () => IStoreState) => {
dispatch(fetchJokeInProgress())
try {
const jokePayload = await fetchJokeAPI();
dispatch(fetchJokeSuccess(jokePayload));
} catch (err) {
dispatch(fetchJokeFail(err));
}
}
}
export function fetchJokeSuccess(payload: string): IFetchJokeSuccessAction {
return {
payload,
type: keys.FETCH_JOKE_SUCCESS,
}
}
export function fetchJokeInProgress(): IFetchJokeInProgressAction {
return {
payload: 'Fetching a good joke.',
type: keys.FETCH_JOKE_INPROGRESS
}
}
export function fetchJokeFail(error: Error): IFetchJokeFailAction {
return {
payload: JSON.stringify(error),
type: keys.FETCH_JOKE_FAIL
}
}
最佳答案
export function fetchJoke(): (dispatch: Dispatch<ActionTypes>, getState: () => IStoreState) => Promise<void> {
return async (dispatch: Dispatch<IFetchJokeInProgressAction | IFetchJokeSuccessAction | IFetchJokeFailAction>, getState: () => IStoreState) => {
dispatch(fetchJokeInProgress())
try {
const jokePayload = await fetchJokeAPI();
dispatch(fetchJokeSuccess(jokePayload));
} catch (err) {
dispatch(fetchJokeFail(err));
}
}
}
由于这将是一个 thunk Action 创建器,因此您必须指定什么类型的 Action 创建器
fetchJoke()
是。您正在使用 thunk Action 创建者,但您的代码中没有任何 thunk 类型。
Promise<void>
但你没有
return
函数中使用。
import { ThunkAction } from "redux-thunk";
import { Dispatch, ActionCreator } from "redux";
export const fetchJoke():ActionCreator<
ThunkAction<
Promise<IFetchJokeSuccessAction|IFetchJokeFailAction>, //return value
StoreState, // your app's store
null, // this is extraArgument is passed to the thunk to fetch data
IFetchJokeSuccessAction|IFetchJokeFailAction // which actions you are using in this thunk func
>
> =()=> {
return async (dispatch: Dispatch<ActionTypes>, getState: () => IStoreState) => {
dispatch(fetchJokeInProgress())
try {
const jokePayload = await fetchJokeAPI();
if(jokePayload){
// jokePayload could be undefined. setting type guard
return dispatch(fetchJokeSuccess(jokePayload));
}
} catch (err) {
return dispatch(fetchJokeFail(err));
}
}
}
type ActionTypes = IFetchJokeSuccessAction | IFetchJokeInProgressAction | IFetchJokeFailAction | IClearJokeAction;
关于reactjs - mapDispatchToProps 上的 Redux Thunk Typescript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254730/
在学习 React-Redux 时,我偶然发现了以下代码,我不确定以下两行和使用 mapDispatchToProps 之间有什么区别? let { dispatch, actions } =
我有: const mapDispatchToProps = dispatch => ( { slipsRadioClickHandler: (value) => { disp
Error: Actions must be plain objects. Use custom middleware for async actions. 我试图在 mapDispatchToPro
我想对 mapDispatchToProps 使用速记符号,但是当我替换老式的 bindActionCreators 策略时 function mapDispatchToProps(dispatch:
假设一个无状态的功能性 UserProfile 组件显示给定 url 的用户数据。假设它被 connect(mapStateToProps, mapDispatchToProps)(UserProfi
在我的index.js中addCoin行动正在发挥作用。 import { addCoin } from './reducer/portfolio/actions' const element = d
我是 redux 的新手,遇到了 mapDispatchToProps 的问题, 我的 react 应用程序中有一个具有不同 div 的组件,每次用户单击 div 时,它都应该通过参数更改所选颜色,然
我有一个看似微不足道的问题,但我一生都无法弄清楚。 FooContainer.tsx ... public render() { ... this.props.onSubmit(123) //
这个问题已经有答案了: What is mapDispatchToProps? (6 个回答) 已关闭 4 年前。 mapStateToProps 之间有什么区别 和 mapDispatchToPro
我已经使用 redux 编写了一个容器组件,我的 mapDispatchToProps 实现如下所示 const mapDispatchToProps = (dispatch, ownProps) =
我对 mapDispatchToProps 有疑问。如何使用按钮中的 onClick 从 mapDispatchToProps “触发”操作? - 登录表单.js。我知道,我还有很多东西要学 :D c
我希望能够在发送参数的同时访问 mapDispatchToProps 中的事件对象。你如何看待这件事? 这是我目前所拥有的: const mapDispatchToProps = dispatch =
父组件 const myParentComponent = ({ sourceValue, classes, doStuff }) => { return (
人们似乎总是在他们需要的每个组件的底部定义这些函数,这是有原因的吗? 当我创建一个 react/redux 项目时,我将它们放在 /mappingFunctions 目录中,然后将它们导入到我需要它们
我不明白的是,在这个柯里化(Currying)风格声明中,为什么调度输入是第二个? connect 不是以 dispatch 作为输入调用这个函数,然后将返回值赋给 props 吗?所以返回值应该是获
我很难理解 mapDispatchToProps 这里使用了一个 mapDispatchToProps 函数 const mapDispatchToProps = () => { return {
我能看懂下面的示例代码: const mapStateToProps = state => { return { todo: state.todos[0] } } const mapD
我正在将 React 与 Redux 结合使用并遵循教程,但我终究无法找出这个错误。 Uncaught TypeError: this.props.fetchPosts is not a functi
请告诉我,为什么当我调用 this.props.getOnEvents() 时,会出现“getOnEvents() is not a function”的错误,这里出了什么问题,如何修复?我正在查看c
所以我的应用程序中有这个简化的结构: 在组件中我有: handlePageClick(data) { this.props.onChangePage(data.selected
我是一名优秀的程序员,十分优秀!