首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何分派一个操作或一个ThunkAction (在TypeScript中,带有redux-thunk)?

如何分派一个操作或一个ThunkAction (在TypeScript中,带有redux-thunk)?
EN

Stack Overflow用户
提问于 2017-03-24 22:15:05
回答 5查看 25.9K关注 0票数 19

假设我有这样的代码:

代码语言:javascript
运行
AI代码解释
复制
import { Action, Dispatch } from 'redux';
import { ThunkAction } from 'redux-thunk';

interface StateTree {
  field: string;
}

function myFunc(action: Action | ThunkAction<void, StateTree, void>,
                dispatch: Dispatch<StateTree>) {
  dispatch(action); // <-- This is where the error comes from
}

...I从TypeScript编译器获得此错误:

代码语言:javascript
运行
AI代码解释
复制
ERROR in myFile.ts:x:y
TS2345: Argument of type 'Action | ThunkAction<void, StateTree, void>' is not assignable to parameter of type 'Action'.
  Type 'ThunkAction<void, StateTree, void>' is not assignable to type 'Action'.
  Property 'type' is missing in type 'ThunkAction<void, StateTree, void>'.

我认为问题在于redux-thunk类型定义文件增强redux Dispatch接口的方式,以及TypeScript无法知道使用哪个Dispatch定义。

有办法绕道吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-03-26 02:50:29

我认为你是正确的,尽管能够处理这两种类型,类型记录无法计算出哪种过载使用。

我认为最好的选择是在调用dispatch时返回到所需的类型

代码语言:javascript
运行
AI代码解释
复制
function myFunc(action: Action | ThunkAction<void, StateTree, void>, 
                dispatch: Dispatch<StateTree>) {
  if (action instanceof ThunkAction<void, StateTree, void>) {
    dispatch(action as ThunkAction<void, StateTree, void>);
  } else {
    dispatch(action as Action);
  }
}

我希望我错了,有更好的方法来实现这一点。

票数 4
EN

Stack Overflow用户

发布于 2018-06-07 04:43:03

ThunkAction签名随着最新版本(现在是ThunkAction<void, Your.Store.Definition, void, AnyAction>)而改变,除非有一些邪恶的双重转换(action as {} as Action),否则我发现更优雅的方法是将redux调度定义为如下所示的ThunkDispatch:

代码语言:javascript
运行
AI代码解释
复制
import { applyMiddleware, Store, createStore, AnyAction } from 'redux';
import logger from 'redux-logger';
import thunk, { ThunkDispatch } from 'redux-thunk';

import { Redux } from '../definitions';
import rootReducer from './reducers';
import { bootstrap } from './actions';

export default function configureStore() {

    const middleware = applyMiddleware( thunk, logger );

    const store: Store<Redux.Store.Definition> = createStore(rootReducer, middleware);

    // Here the dispatch casting:
    (store.dispatch as ThunkDispatch<Redux.Store.Definition, void, AnyAction>)( bootstrap() );

    return store;

}

如果其他人正在寻找更新的答案!^^

票数 28
EN

Stack Overflow用户

发布于 2019-07-18 12:34:51

自从这个问题出现以来,时间已经过去了,许多事情也发生了变化,各种各样的答案也被张贴了出来。然而,我发现没有一个答案对我来说是令人满意的,因为前两个(michael和pierpytom)涉及重新定义/重新定义哪个感觉很奇怪。第三个(joaoguerravieira)似乎更好,因为它没有涉及其中任何一个,但不清楚,至少对我来说,它是如何解决问题的。

当我遇到一个我认为与此几乎相同的问题时,这对我来说似乎是最有帮助的:如何在创建的redux存储上获得一个正确类型的“分派”方法。也就是说,如何让TypeScript编译器同意store.dispatch可以分派操作或ThunkActions。即使这不是最初问题中所问到的问题(但我认为可能是这样),所有关于我问题的搜索引擎查询都让我回到了这个帖子,所以我认为把我的解决方案放在这里也许会有帮助。

在使用redux时,我总是发现找到合适的类型非常困难(也许我只是个傻瓜),所以很长一段时间以来,我总是像这样创建我的商店:

代码语言:javascript
运行
AI代码解释
复制
createStore(
    combineReducers(stuff),
    defaultState,
    applyMiddleware(thunkMiddleware));

...which总是让我处于可以在块上调用store.dispatch的情况,但是TypeScript编译器对我大喊大叫,尽管它在运行时仍然可以工作。每一个答案的一些部分最终让我找到了我认为是解决这个问题的最先进、最不重要的方法。

在存储对象上键入调度方法取决于对redux的createStore的调用返回的内容。为了在存储的分派方法上具有正确的类型,您必须在调用applyMiddleware时正确地设置类型参数(您可以直接或最终将其作为第三个参数传递给createStore)。@joaoguerravieira的回答使我朝这个方向看。为了使调度方法具有正确的类型来分派ThunkAction或Action,我不得不调用createStore/apply中间件,如下所示:

代码语言:javascript
运行
AI代码解释
复制
createStore(
    combineReducers(stuff),
    defaultState,
    applyMiddleware<DispatchFunctionType, StateType>(thunkMiddleware));

哪里

代码语言:javascript
运行
AI代码解释
复制
type DispatchFunctionType = ThunkDispatch<StateType, undefined, AnyAction>

通过这样做,我得到了一家这样的商店:

代码语言:javascript
运行
AI代码解释
复制
Store<StateType, Action<StateType>> & { dispatch: DispatchFunctionType };

...which为我提供了这种类型的store.dispatch函数:

代码语言:javascript
运行
AI代码解释
复制
Dispatch<Action<any>> & ThunkDispatch<any, undefined, AnyAction>

...which可以成功地分派一个操作或一个ThunkAction,而无需对类型大喊大叫,也不需要任何重新定义/转换。

正确设置对applyMiddleware的调用中的类型参数至关重要!

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43013204

复制
相关文章
HTML篇(006)-title 与 h1 的区别、b 与 strong 的区别、i 与 em 的区
①title用于网站信息标题,突出网站标题或关键字,一个网站可以有多个title,seo权重高于H1;H1概括的是文章主题,一个页面最好只用一个H1,seo权重低于title。
齐丶先丶森
2022/05/12
4660
WordPress 教程:the_title() 与 the_title_attribute() 的正确用法
WordPress 提供了一个非常简单方便的函数来显示当前文章的标题,那就是:the_title()。这个函数经常被开发者在 header,post,page,loop,footer 里使用,这几乎是开发主题里最常用的函数之一,然而许多开发者并没有意识到这里有个地方并不应该使用此函数,那就是在 attributes 里,如:
Denis
2023/04/15
2.6K0
将Git与Github进行SSH连接
<!--more--> <a href="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=112763915,265947675&fm=26&gp=0.jpg" class="highslide" onclick="return hs.expand(this,{slideshowGroup:'images'})"><img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=112763915,265947675&fm=26&gp=0.jpg"></a> # Githu与Github 首先, - `Git`是一款免费、开源的分布式版本控制系统; - `Github`是用`Git`做版本控制的代码托管平台; 用一句话形容这二者的关系:Git是弓,你的代码是箭,Github是靶子。 Git是软件,它可在本地建立仓库,你写的代码的各个版本都可以存着 Github是网上仓库,你写的代码的各个版本都可以存着。 # 安装使用 ## 安装Git 1. 到[Git官网](https://git-scm.com/downloads)下载与你正在使用的操作系统(本文以`windows`为例)相对应的文件。一般地,选择`64-bit Git for Windows Setup`。 2. 安装时注意:勾选添加git到`环境变量`;在Windows Explorer Integration中勾选`Git Bash Here`。其余配置默认即可。 3. 安装完成后(可能需要**注销或重启**),在任意一个文件夹空白处右键,检查是否有`Git Bash Here`的选项。 ## 注册GitHub 到[GitHub官网](https://sqdxwz.com)注册一个账号。这里我以我的Github账号:`WangRongsheng` 为例进行演示。 ## 配置git与github关联 ### 设置邮箱和用户名 打开`Git Bash`(输入命令**均在Git Bash中进行**,以后不再声明),分别输入下列命令(输入一行命令后需要回车,以后不再声明): ```html git config --global user.name "WangRongsheng" git config --global user.email "603329354@qq.com" ``` 下面这一行设置可以增强输出命令的可读性: ```html git config --global color.ui auto ``` ### 用ssh生成公钥 输入: ```html ssh-keygen -t rsa -C "603329354@qq.com" ``` 回车之后会出现如下所示的输出,直接按回车即可: ```html Generating public/private rsa key pair. Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa): (按回车键) Enter passphrase (empty for no passphrase): (按回车键) Enter same passphrase again: (按回车键) ``` 这样密钥文件就生成了,默认在用户目录下,如:`C:\User\xxx\.ssh\` 这个文件夹中。其中的xxx是你的windows用户名。 ### 将公钥添加到`github`中 1. 在`C:\user\xxx\.ssh\`文件夹中找到`id_rsa.pub`这个文件,用文本编辑器(如记事本)打开,复制里面的所有内容。 2. 登陆`github账号`,点击头像旁的`小三角`展开,点击`settings`-`SSH and GPG keys`-`New SSH key`,在`Title`中取一个名字(任意),`key`中粘贴你刚刚复制的内容。然后点击`Add SSH key`即可。 ### 测试是否关联成功 输入: ```html ssh -T git@github.com ``` 出现以下结果即为成功: ```html Hi WangRongsheng! You've successfully authenticated, but GitHub does not provide shell access. ```
王荣胜
2020/03/13
7110
img中alt与title辨析
HTML5学堂:img中alt与title有何不同?本文主要从表现在含义、浏览器中的表现以及对于网站seo优化程度三个方面进行辨析,接下来我们一起来看看。 示例代码: <img src="h5course.jpg" alt="蜡笔小新 属性alt的值" title="蜡笔小新 属性title的值"> 1、含义不同: img标签alt属性是当图片不存在时或加载失败时的替代文字(进行显示);img标签title属性是对图片的描述与进一步说明。 2、在浏览器中的表现不同: 在FF、chrome和IE8+中,当鼠标
HTML5学堂
2018/03/12
1.4K0
img中alt与title辨析
js 动态修改浏览器标签的 title
django 前后端不分离项目的话,js 放在 base.html 模板里,其他模板继承 base.html,就可以全部页面都有标签 title 变化的效果了。
卓越笔记
2023/02/18
5.3K0
滚动title
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>^_^欢迎浏览本网站</title> </head> <body> </body> <script type="text/javascript"> var position=0; var message='^_^欢迎浏览本网站'; var x=2*(60/messag
河湾欢儿
2018/09/06
4.3K0
如何将wordpress的the_title()进行大小写处理
  有时我们在做wordpress网站时需要将标题的大写字母改成小写字母或小写字母转为大写字母方便调用,那么要如何改造呢?我们知道Wordpress the_title()函数默认回显标题,标准写法是
ytkah
2019/10/11
1.2K0
Blog Template Title
原文地址http://soft.dog/2018/07/06/blog-template/
franket
2021/08/10
1.1K0
TOP-TITLE
<%@ page contentType="text/html; charset=gb2312" language="java"  %>  <%@ page import="java.sql.*" %> <%@ page import="java.text.ParsePosition" %> <%@ page import="java.text.SimpleDateFormat" %> <%@ page import="java.util.Date" %> <jsp:useBean id="result" 
一朵灼灼华
2022/08/05
1.3K0
Angular Title Service 详解
Angular Title Service 用于获取和设置当前 HTML 文档的标题。Title Service 提供了以下方法:
阿宝哥
2019/11/05
2.1K0
如何将ReactJS与Flask API连接起来?
构建既可扩展又引人入胜的现代 Web 应用程序需要使用相关技术。ReactJS和Flask是两个流行的框架,分别用于前端和后端开发。
很酷的站长
2023/08/11
5050
如何将ReactJS与Flask API连接起来?
Node.js 连接 MySQL
安装驱动 本教程使用了定制的 cnpm 命令进行安装: $ cnpm install mysql 连接数据库 在以下实例中根据你的实际配置修改数据库用户名、及密码及数据库名: test.js 文件代码: var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : '123456', datab
陈不成i
2021/07/13
2.2K0
关于vue的title标签中出现的htmlWebpackPlugin.options.title
(3条消息) 关于vue的title标签中出现的htmlWebpackPlugin.options.title_cokoD的博客-CSDN博客 
跟着阿笨一起玩NET
2020/09/27
3K0
关于H1的位置
相信大多数人都偏向第一种方式:用于文章标题上,从文章的角度上看,用户进到内容页里,想看到的当然就是文章的内容,文章标题理所当然是最重要的、最应该突出的。
GhostZhang
2022/08/21
3190
Markdown 使用参考h1
Markdown是一种易读易写的标记语言。它能被生成HTML。Markdown的目标是:成为一种适用于网络的书写语言。
前端GoGoGo
2018/08/27
7080
Markdown 使用参考h1
ECharts标题 Title 配置
var myChart=echarts.init(document.getElementById('main')); //init初始化接口,返回ECharts实例,其中dom为图表所在节点 var option = { //标题 title : { show:true,//显示策略,默认值true,可选为:true(显示) | false(隐藏) text: '主标题',//主标题文本,'\n'
安德玛
2022/03/09
1.8K0
Android去掉title:windowNoTitle
但是以上文件改动生效的前提是Manifest.xml中的添加:android:theme=”@style/AppTheme”
全栈程序员站长
2022/07/19
1.6K0
Vue.js入门
Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。
Vincent-yuan
2020/07/06
1.8K0
Node.js 连接 MongoDB--查询分页和连接
如果要设置指定的返回条数可以使用limit()方法,该方法只接受一个参数,指定了返回的条数。
陈不成i
2021/07/13
2.2K0
点击加载更多

相似问题

在Jenkins CLI中添加作业

12

收到新作业时取消Jenkins作业

10

如果将Jenkins作业排队的TFS生成定义已取消,则取消Jenkins作业

129

Trigger Jenkins构建cli,嵌套作业

12

Jenkins -用于更改创建的Jenkins作业中的凭据的CLI/Rest API

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档