reactjs - useEffect 清理函数 Typescript 错误:不可分配给“EffectCallback”类型的参数
问题描述
我有这段代码应该执行以下操作:
- 在第一次渲染后调度一个 thunk 加载数据
- 调度操作以重置状态作为该效果的清理功能
由于dispatch
并且slug
在此组件生命周期中不会发生变化,因此清理基本上将在组件卸载后运行。
const dispatch = useDispatch();
const slug = props.match.params.slug || "";
useEffect(() => {
dispatch(THUNKS.LOAD_DATA(slug));
return () => { dispatch(ACTIONS.RESET_STATE()); };
},[dispatch,slug]);
一切都按预期工作。但我想将清理函数编写为:
return () => dispatch(ACTIONS.RESET_STATE());
我知道return
当我这样写时,箭头函数会添加一个隐式语句。所以基本上我正在回dispatch()
电话。
正因为如此,Typescript 抱怨以下错误消息:
Argument of type '() => () => { payload: undefined; type: string; }' is not assignable to parameter of type 'EffectCallback'.
我认为正在发生的事情:EffectCallback
可能期待void
作为return
,突然我正在回dispatch()
电话。
我可以自定义类型以EffectCallback
某种方式接受此返回调用并摆脱此错误吗?
解决方案
问题dispatch
实际上是返回动作对象,所以它不是一个void
函数。您只想忽略返回的值。
我有一个可能看起来很愚蠢的解决方案,除非这是您经常使用的模式,因为我们所做的只是将花括号移到另一个地方。但它可能是一个地方而不是多个地方。
我们可以用我们自己的自定义版本覆盖,而不是弄乱打字稿定义,useDispatch
实际上它不会返回任何东西。
import { useDispatch as useRegularDispatch } from "react-redux";
import { Action, AnyAction } from "redux";
export interface VoidDispatch<A extends Action = AnyAction> {
<T extends A>(action: T): void;
}
export const useDispatch = <A extends Action = AnyAction>(): VoidDispatch<A> => {
const regularDispatch = useRegularDispatch();
return (action: A) => { regularDispatch(action); };
};
然后,您可以毫无问题dispatch
地在清理中使用。useEffect
推荐阅读
- java - 春季动态特征标志
- r - 带有省略号的PCA,R中没有颜色
- ssl - IBM WAS 7.5 SSLException SSLSocketFactory 为空
- mysql - MySQL 优化:单个查询中的多种模式(最常见的值)
- python - NoReverseMatch at /cart/ 未找到带有参数 '('',)' 的“cart_add”的反向。尝试了 1 种模式:['cart/add/(?P
[0-9]+)/$'] - r - 如何在 R 中导入 Excel 表以获取二进制变量?
- java - 使用 MapR MultipleOutputs 写入 OrcNewOutputFormat 时出错
- symfony - 替换继承另一个服务的参数
- delphi - 在 4K 显示器上缩放 DbGrid 指示器和 DbNavigator 图标
- android - com.android.builder.internal.aapt.v2.Aapt2Exception 将 android studio 更新到 3.2 后