MapDispatchToProps 导致父组件中出现 Typescript 错误,期望 Actions 作为 props 传递

2023-11-21

在我的子组件中,我定义了 MapDispatchToProps,将它们传递到 connect 中,并相应地定义了一个在 React.Component Props Interface 中扩展的接口 PropsFromDispatch。现在,在我的父组件中,Typescript 告诉我它缺少我在 PropsFromDispatch 中定义的属性。

这看起来并不完全荒谬,因为我将它们定义为 React.Component Props 接口的一部分,但是我希望“connect”能够像处理我的 PropsFromState 一样处理这个问题,我也不必从父组件传递到子组件,而是从 State 映射到 Props。

/JokeModal.tsx

...

interface Props extends PropsFromState, PropsFromDispatch {
    isOpen: boolean
    renderButton: boolean
}

...

const mapDispatchToProps = (dispatch: Dispatch<any>): 
PropsFromDispatch => {
    return {
        tellJoke: (newJoke: INewJoke) => dispatch(tellJoke(newJoke)),
        clearErrors: () => dispatch(clearErrors())
    }
}

interface PropsFromDispatch {
    tellJoke: (newJoke: INewJoke) => void
    clearErrors: () => void
}

...

export default connect(mapStateToProps, mapDispatchToProps)(JokeModal);

/Parent.tsx

...

button = <JokeModal isOpen={false} renderButton={true} /> 
...

在 /Parent.tsx 的这一行中,Typescript 现在告诉我:

Type '{ isOpen: false; renderButton: true; }' is missing the 
following properties from type 'Readonly<Pick<Props, "isOpen" | 
"renderButton" | "tellJoke" | "clearErrors">>': tellJoke, clearErrors 
ts(2739)

有趣的是,我可以通过删除 MapDispatchToProps 并将操作直接传递到 connect 中来完全避免错误(包括操作创建器中已经存在的分派):

export default connect(mapStateToProps, { tellJoke, clearErrors })(JokeModal);

不过,我想知道如何在这里使用 MapDispatchToProps 以及为什么 Typescript 希望我将这些操作传递给子组件?

很高兴听到您的建议!


我能够重现您的问题,问题显然出在类型签名中mapDispatchToProps函数在源代码,你可以看到它有一个类型参数Action = AnyAction

export interface Dispatch<A extends Action = AnyAction> {
  <T extends A>(action: T): T
}

解决你的问题的办法就是改变Dispatch<any> to Dispatch<AnyAction>:

const mapDispatchToProps = (dispatch: Dispatch<AnyAction>): PropsFromDispatch

请注意,由于您使用的是 redux-thunk,类型系统可能不允许您调用dispatch重击,所以你可能不得不通过调用来作弊

clearErrors: () => dispatch<any>(clearErrors());

或者使用相当冗长的输入ThunkDispatch and ThunkAction。我在这里有一个这样的打字示例:ThunkDispatch以及相应的Thunk动作。请注意,我使用类型安全操作.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MapDispatchToProps 导致父组件中出现 Typescript 错误,期望 Actions 作为 props 传递 的相关文章

随机推荐

  • 使用 out 参数反思静态重载方法

    我在通过反射调用带有输出参数的重载静态方法时遇到一些问题 并且希望得到一些指针 我正在寻找动态创建类似的类型System Int32 or System Decimal 然后调用静态TryParse string out x 方法就可以了
  • Python Pandas - 查找具有最大聚合值的连续组

    我有一个包含日期时间和整数的数据框 import numpy as np import pandas as pd df pd DataFrame df dt pd date range 2017 01 01 12 00 2017 01 01
  • 如何在 PostgreSQL 中以编程方式查找继承表?

    我有一个 PostgreSQL 8 3 数据库 其中使用了表继承 我想获取所有表及其模式名称的列表 该模式名称是使用查询从基表继承的 我们有什么办法可以使用 PGSQL 得到这个吗 由于您使用的是旧版本的 PostgreSQL 您可能必须使
  • AutoMapper 无法将 enum 转换为 nullable int?

    我收到 AutoMapperMappingException 异常 引发了 AutoMapper AutoMapperMappingException 类型的异常 gt System InvalidCastException 从 Dummy
  • OpenGL 将纹理映射到球体

    我有 OpenGL 程序 我想用地球位图来纹理球体 我在 Blender 中准备了网格并将其导出为 OBJ 文件 程序正确加载适当的网格数据 顶点 uv 和法线 和位图 我已经检查了它与骨骼位图的纹理立方体 我的程序是纹理球体 但不正确 或
  • 接口的所有方法都是抽象的吗?

    我看到大多数地方都写着 All of the methods in an interface are abstract 但接口也可能包含default methods and static methods方法体存在于默认方法和静态方法中 那
  • 哪个 PDF 生成 API (Java) 支持古吉拉特语字体?

    我尝试过 iText PDFBox 和 Oracle Forms 我还成功地使用 iText 生成了古吉拉特语 PDF 文档 但是 不幸的是它没有生成古吉拉特语 UTF 8 语言的正确字体 我的项目是 jdk 1 4 这是强制使用的 所以
  • 按具有最大列值的记录过滤 Django 查询

    有没有一种简单的方法可以根据列中具有最大 最小值的记录来过滤 Django 查询 我本质上是在问these 问题 但是在 Django 的 ORM 的特定上下文中 e g 假设我有一个模型旨在存储每个人电话号码的历史值 class Pers
  • 将 TabControl ItemsSource 绑定到 ViewModel 集合

    由于某种原因 我很难得到我的TabControl绑定时正确显示ItemsSource to a ObservableCollection视图模型 我的设计基于此处找到的教程 http msdn microsoft com en us mag
  • Resharper 单元测试运行程序找不到内容文件

    我有一些测试依赖于我标记为 内容 和 始终复制 的一些文件 我使用 DeploymentItem 属性来确保在 VS 外部运行 mstest 时将它们复制到输出目录 然而 当在 VS 中使用 Resharper 测试运行器时 这些文件永远不
  • F# - int 类型与 unit 类型不兼容

    对于函数式语言来说相当陌生 但我正在使用大量 F 维护别人的代码 谁能对此提供一些见解 let mtvCap Rendering MTViewerCapture mtViewer mtvCap GetCapture mtvCap ToWpf
  • SQL 过程中的打印语句会影响性能吗?

    我正在使用 SQL Server 程序并且我有使用的习惯Print存储过程中的语句用于区分过程代码 我的数据库中有近 200 250 个过程 print 语句应该影响性能吗 我正在开发多用户 Windows 应用程序 我发现在我的桌面上运行
  • ASP.NET MVC 从 URL 获取路由值

    我想计算出该路线的价值是多少UrlReferrer在控制器的动作中 我无法弄清楚传入的 URL 在 MVC 管道的哪一部分被转换为 RouteValues 我想要实现的目标与此接近 你需要打电话RouteTable Routes GetRo
  • 调用 Node.js fork 时处理“找不到模块”错误

    如何捕获调用不存在的文件的 fork 错误 var cp require child process var fk cp fork missing file js 喷出 module js 340 throw err Error Canno
  • Next.js 默认情况下是同站点来源,但我仍然可以访问它

    我想知道如何保护我的 api 路由 文档说 api 路由默认是同站点源 API 路由不指定 CORS 标头 这意味着它们仅在默认情况下是同源的 您可以通过使用 cors 中间件包装请求处理程序来自定义此类行为 Next js 文档 但是 如
  • Android DrawerLayout 无法与 ViewPager 一起使用?

    我已经实施了浏览器里面一个抽屉布局它工作正常 但抽屉菜单列表视图无法正确显示 操作栏将显示在 ViewPager 选项卡下方 希望下图能给您一个想法 我正在使用动作条夏洛克图书馆 如何在操作栏正下方显示抽屉菜单列表视图 我已经尝试过了 活动
  • 在 php 5.3 之前伪造后期静态绑定

    我需要一个继承的静态函数 调用 来调用另一个已被重写的静态函数 内部 我可以通过后期静态绑定来做到这一点 但我的主机还没有 php5 3 所以我需要解决它 class ClassA static function call return s
  • ORM(对象关系映射)中的“N+1选择问题”是什么?

    N 1 选择问题 通常被认为是对象关系映射 ORM 讨论中的一个问题 我理解它与必须对对象中看似简单的东西进行大量数据库查询有关世界 有人对这个问题有更详细的解释吗 假设您有一个集合Car对象 数据库行 以及每个Car有一个集合Wheel对
  • 是否可以在 Python 中的 Azure Function Linux 使用计划中保存临时文件?

    首先对我的英语感到抱歉 我有一个使用 Python 的 Azure Function Linux 消费计划 我需要生成一个 html 使用 wkhtmltopdf 转换为 pdf 并通过电子邮件发送 generate temporally
  • MapDispatchToProps 导致父组件中出现 Typescript 错误,期望 Actions 作为 props 传递

    在我的子组件中 我定义了 MapDispatchToProps 将它们传递到 connect 中 并相应地定义了一个在 React Component Props Interface 中扩展的接口 PropsFromDispatch 现在