Typescript NgRx:如何声明action creator创建的操作的显式类型?

Typescript NgRx:如何声明action creator创建的操作的显式类型?,typescript,unit-testing,ngrx,Typescript,Unit Testing,Ngrx,在启动一个新的应用程序并使用NgRx的新action creator模式后,我发现自己缺少一个操作的显式类型。例如,当我测试一个服务时,我想知道它是否使用正确的属性发送了正确的操作 在TypeScript中保留类型安全性的同时,如何进行此操作 例如: //下一行中的“??”应该是什么? spyOn(存储,“发送”).和.callFake((操作:?)=>{ expect(action.type).toBe(fetchProductStructureAction.type); //如果我没有将正确

在启动一个新的应用程序并使用NgRx的新action creator模式后,我发现自己缺少一个操作的显式类型。例如,当我测试一个服务时,我想知道它是否使用正确的属性发送了正确的操作

在TypeScript中保留类型安全性的同时,如何进行此操作

例如:

//下一行中的“??”应该是什么?
spyOn(存储,“发送”).和.callFake((操作:?)=>{
expect(action.type).toBe(fetchProductStructureAction.type);
//如果我没有将正确的类型添加到操作中,TypeScript会在这里抱怨

expect(action.property).toBe(expectedProperty);//您可以从
ngrx/store
action
放在那里

这个肯定有用

spyOn(存储,'dispatch')。和.callFake((操作:操作)=>{
expect(action).toEqual(jasmine.objectContaining)({
类型:fetchProductStructureAction.type,
属性:expectedProperty,
}));
});
如果希望在回调中保留原始类型,则需要将方法强制转换为
any
,但随后它会为creator函数带来
ReturnType
的情况

spyOn(存储,“分派”如有)。和.callFake((操作:MyActionCreatorFunction)=>{
expect(action.type).toBe(fetchProductStructureAction.type);
expect(action.property).toBe(expectedProperty);
})

这将起作用,谢谢。不过,我认为很遗憾,我们丢失了操作的键入。如果我重构操作以更改属性名称,我的编辑器无法在此测试中自动进行更改。老实说,我不明白为什么操作创建者是新的默认值。我们为了在decl上获得几个字符放弃了很多aration…我不允许在测试中使用autorename,以确保有人真正触碰了代码,以确保代码不会在之后被破坏。无论如何,我现在得到了您的要求,并今天检查了一个更好的解决方案。测试是一个示例,但我在代码的其他地方也需要它。到目前为止,唯一有效的方法是en
ReturnType
但它确实冗长难看,特别是对新手来说。我找到了一种使用
any
的方法,你能检查一下它是否适合你吗?我想作为一个选项,你可以编写一个断言函数来验证类型,比如
ngrxAction(action,myActionCreatorFunction)
并声明操作遵循它-然后下面的代码应该理解所有属性,但它是TS 3.8附带的