首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何对返回类型与调度类型不同的redux dispatcher进行类型提示?

如何对返回类型与调度类型不同的redux dispatcher进行类型提示?
EN

Stack Overflow用户
提问于 2019-05-20 09:42:02
回答 1查看 258关注 0票数 4

我想输入一个不同于分派类型的操作创建者。

我尝试用这两种类型来提示ThunkResult,但这并不理想。

代码语言:javascript
运行
AI代码解释
复制
// types.ts
interface AppListAction extends FetchAction {
  type: typeof APP_LIST,
  [FETCH]: {},
}

interface AppListSuccessAction extends FetchResponseAction {
  type: typeof APP_LIST_SUCCESS,
  response: Array<ListModel>
}

export type AppResponseActions =
  AppListSuccessAction

export type AppActions =
  AppListAction
  | AppResponseActions


// actions.ts
export const loadListCreator = (): AppActions => ({
  type: C_LIST,
  [FETCH]: {},
})

export const loadList = (): ThunkResult<AppResponseActions> => (dispatch: ThunkDispatcher) => dispatch(loadListCreator())

我预计不会出现错误,但我收到的却是:

TypeScript错误:类型'AppActions‘不可分配给类型'AppResponseActions’。类型'AppListAction‘不可赋值给类型'AppResponseActions’。类型“”AppListAction“”中缺少属性“”response“”,但类型“”AppListSuccessAction“”中需要该属性。“”TS2322

EN

回答 1

Stack Overflow用户

发布于 2019-05-27 03:47:15

为了使您的代码可编译,我做了以下假设

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

const FETCH = 'fetch';

interface FetchAction {
    [FETCH]: object;
}

interface FetchResponseAction {
    prop2: string;
}

const APP_LIST = 'APP_LIST';
const APP_LIST_SUCCESS = 'APP_LIST_SUCCESS';

interface ListModel {
    prop3: string;
}

在你的代码之后

代码语言:javascript
运行
AI代码解释
复制
type ThunkResult<R> = ThunkAction<R, State, undefined, AppActions>;
type ThunkDispatcher = ThunkDispatch<State, undefined, AppActions>;

根据上面的假设,您的代码可以通过以下修改进行编译

代码语言:javascript
运行
AI代码解释
复制
export const loadList = (): ThunkResult<AppActions> => (dispatch: ThunkDispatcher) => dispatch(loadListCreator());

ThunkResult<AppActions>的类型应为R = AppActionsRThunkResult类型的函数的返回值。在Redux-Thunk源代码中,ThunkAction的定义如下

代码语言:javascript
运行
AI代码解释
复制
export type ThunkAction<
    TReturnType,
    TState,
    TExtraThunkArg,
    TBasicAction extends Action
> = (
    dispatch: ThunkDispatch<TState, TExtraThunkArg, TBasicAction>,
    getState: () => TState,
    extraArgument: TExtraThunkArg
) => TReturnType;

因此ThunkAction ( ThunkResult所基于的)是一个返回值为TReturnType类型的函数。

然后尝试使ThunkResult<>类型的loadlist等于(dispatch: ThunkDispatcher) => dispatch(loadListCreator())。本质上也是函数,但返回的是dispatch调用的结果。dispatch的类型为ThunkDispatcherfrom source的类型为

代码语言:javascript
运行
AI代码解释
复制
export interface ThunkDispatch<
    TState,
    TExtraThunkArg,
    TBasicAction extends Action
> {
    <TReturnType>(
        thunkAction: ThunkAction<TReturnType, TState, TExtraThunkArg, TBasicAction>
    ): TReturnType;
    <A extends TBasicAction>(action: A): A;
}

所以它是一个重载函数,接受一个类型为A的参数,并返回类型为A的结果。由于dispatch是用返回AppActions类型结果的loadListCreator()调用的结果调用的,因此A被推断为AppActions

由于您希望将返回AppActions的函数分配给返回AppResponseActions的函数,因此未正确编译原始代码。AppActions是联合类型,可以是AppResponseActionsAppListAction。如果它是AppListAction,则不能将其分配给AppResponseActions

我想我已经描述得很清楚了:-)

从实践的角度来看,你的代码有点过于复杂了。

考虑这样简化它。

  1. 从操作类型继承所有操作

从‘redux’导入{ AppListAction };接口APP_LIST扩展操作{ type: type to APP_LIST,FETCH:{},}

  • 设置类型ThunkResult为以下类型

类型ThunkResult = ThunkAction;

最有可能的是,您不需要TReturnType。(void).

  • Action操作只是在代码中分派所需的所有内容,而不返回任何内容。同步操作的Thunk创建器可能如下所示

接口SyncAction1扩展操作{类型:'SYNC_ Action ',参数:字符串}常量SomeSyncAction =(参数:字符串) => {类型:'SYNC_ action ',参数}用于异步操作的

  • 操作创建器可能如下所示

导出常量结果= ():ThunkResult结果( =>:ThunkDispatcher) => { dispatch(/*开始加载*/);const result = await //加载接口调用分派(loadListCreator(Result));}

  • Reducer将如下所示

导出函数状态( loadReducer = initalState,动作: AppActions) // reducer代码

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

https://stackoverflow.com/questions/56218221

复制
相关文章
ReturnSingleDatabase为True报错
出现这个错误是因为Excel在最初发布的2016版本上加入了更新,而流传的破解包都是最初发布的版本,但好在即使是破解版本我们依然可以更新
但老师
2022/03/22
3580
ReturnSingleDatabase为True报错
怎么在a_bool的值为True的条件拼接a和a_1?
前几天在Python钻石群有个叫【有点意思】的粉丝问了一道关于pandas中字符串拼接问题,如下图所示。
前端皮皮
2022/08/17
6350
怎么在a_bool的值为True的条件拼接a和a_1?
python条件执行
布尔值有真(True)或者假(False)两个。 为了使程序能够根据条件执行不同的语句,通常需要判断一个布尔值。 布尔表达式可以给出布尔值。比如x == y就是一个布尔表达式,它会判断变量x与变量y是否相等。符号==是一个比较运算符,若两个运算对象相等,则返回True;若两者不相等,则返回False。 还可以使用其他的比较运算符: x == y # x等于yx != y # x不等于yx > y # x大于yx < y # x小于y
mwangblog
2018/07/04
9970
关于分段免杀执行的思考
我们在写shellcode时候,做分段免杀执行时,如何做到边解码然后执行再调用解码,解码后再执行?就是分段执行而且解密的密钥是不一样的,对于这个问题,我们应该想想这三个问题。
FB客服
2020/03/17
8080
顺序执行命令,条件执行,管道
顺序执行命令,条件执行 有时候等一条指令执行,时间太久,不妨堆起来一起执行,执行完一条再下一条 每条指令用;隔开就可以啦 sudo apt-get update; sudo apt-get ins
98k
2018/04/12
1.3K0
为啥PHP in_array(0,['a', 'b', 'c']) 返回为true?
但是,直观上看, 0并没有包含在['a', 'b', 'c']数组中,也不会等于'abc'这个字符串。那怎么解释上述的返回结果呢?
架构精进之路
2020/08/17
1.7K0
ReturnSingleDatabase为True报错的解决办法
出现这个错误是因为Excel在最初发布的2016版本上加入了**更新**,而流传的破解包都是最初发布的版本,但好在即使是破解版本我们依然可以更新
但老师
2020/08/02
5930
ReturnSingleDatabase为True报错的解决办法
MCU在执行main之前做了什么?
本文以Arm Cortex-M为例,介绍了在IAR Embedded Workbench中微控制器(MCU)的启动过程。在MCU复位后,程序计数器(PC)会指向相应的复位向量,并开始执行启动代码(startup code)。如果MCU支持浮点单元(FPU),则在启动过程中,首先会调用__iar_init_vfp来初始化FPU,然后继续执行__iar_program_start。接着,__iar_program_start会调用__cmain函数。在__cmain中,会先调用__low_level_init函数,然后调用__iar_data_init3来进行全局和静态变量的初始化。在__iar_data_init3中,首先会调用__iar_zero_init3来初始化初始值为0的全局和静态变量,随后会调用__iar_copy_init3来初始化初始值为非0的全局和静态变量。最终,在启动过程的最后阶段,会通过调用__call_main来跳转到main函数,从而开始执行主程序。
刘盼
2023/08/22
9670
MCU在执行main之前做了什么?
为什么 Java 中1000==1000为false,而100==100为true?
基本知识:我们知道,如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。
终码一生
2022/04/14
3630
为什么 Java 中“1000==1000”为false,而”100==100“为true?
基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
肉眼品世界
2022/03/29
4750
为什么Java中1000==1000为false而100==100为true?
基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
哲洛不闹
2018/09/18
5950
在main方法之前,到底执行了什么?
本人在做接口测试的时候,需要用一个公共类来把所有的执行的代码,然后这个公共类有hsot和hosttype等属性来区分各个测试环境,然后在去不同的地方取用例和请求接口。在给这些属性复制的时候,我是通过不同测试环境新建不同的配置文件,然后执行每个环境的时候让只加载需要测试的环境的配置文件来实现管理测试环境的。中间遇到了一些坑,主要就是对java代码执行循序,特别是在main方法之前的代码执行顺序了解不深入导致的,中间有多个继承关系也有点扰乱了思路。下面分享一下自己这个错误的复现步骤。
FunTester
2019/08/30
7360
如何向女朋友解释int==Integer为true
通常大家对此的解释是,==对于基本类型来说比较的是值,对于引用类型来说比较的是引用,即指向的对象的内存地址。这样解释没错,b==c结果为false毋庸置疑,因为两个都是引用类型。但是为什么a==b(a==c)一个是基本类型一个是引用类型,比较的时候还是值比较呢?
编程大道
2019/07/15
4910
如何向女朋友解释int==Integer为true
为什么Java中1000==1000为false而100==100为true?
基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
Leetcode名企之路
2020/09/04
6130
为什么 Java 中“1000==1000”为false,而”100==100“为true?
基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
周辰晨
2022/09/20
4920
为什么Java中1000==1000为false而100==100为true?
原文:Why 1000 == 1000 Returns False, but 100 == 100 Returns True in Java? 作者:Bazlur Rahman 译文:http://w
顶级程序员
2018/05/03
7390
为什么 Java 中“1000==1000”为false,而”100==100“为true?
为什么 Java 中“1000==1000”为false,而”100==100“为true? 这是一个挺有意思的讨论话题。
开发者技术前线
2020/11/24
5170
为什么 Java 中“1000==1000”为false,而”100==100“为true?
为什么Java中1000==1000为false而100==100为true?
基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
Java后端技术
2018/08/09
5430
点击加载更多

相似问题

如果不是null,则在中为True

14

如果条件为true,则在用户检查完后,取消选中selectBooleanCheckbox

11

如果条件为true,则继续执行while循环。

53

Rails:如果模型属性为true,则在视图中执行以下操作

10

如果条件为true,则使if条件返回;如果为true,则返回while条件

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文