【发布时间】:2017-11-22 18:49:18
【问题描述】:
我有一个减速器测试通过,但最后抛出了这个奇怪的错误:
console.error node_modules/redux/lib/utils/warning.js:14
No reducer provided for key "newProducts"
src/reducer/index.ts
import newLineItemReducer from "./newLineItemReducer";
import renewedLineItemReducer from "./renewedLineItemReducer";
export interface LineItemState{
renewedProducts: LineItem[]
newProducts: LineItem[]
}
//used by both reducers
export interface LineItem{
...
}
// used by both "new" and "renewed" slice reducers
export function sharedFunction1() {
...
}
export default combineReducers<LineItemState>({
renewedProducts: renewedLineItemReducer,
newProducts: newLineItemReducer
});
src/reducer/newLineItemReducer.ts
import {LineItem, sharedFunction1 } from "./";
type Action = ...;
const newLineItemReducer =
(state: LineItem[] = [], action: Action): LineItem[] => {
switch (action.type) {
case ...:
sharedFunction1(state, action.foo);
}
}
export default newLineItemReducer;
test/newLineItemReducer.spec.ts
import newLineItemReducer from "@src/reducers/newLineItemReducer";
test("foo", () => {
let state = //
let action = //
const updatedState = newLineItemReducer(state, action);
...
});
奇怪的是,实际上并没有从 index.js 调用根 reducer 的代码。我的测试是直接调用切片“newLineItemReducer”。似乎只是从reducer/index.ts 导入共享接口和案例函数的行为导致了问题(如果我删除combineReducer 导出没有错误)?
【问题讨论】:
-
我的猜测是当两个文件相互导入时,您遇到了循环导入的问题。
newLineItemReducer.ts导入index.ts再次导入newLineItemReducer.ts。根据模块加载器的不同,您可能会收到错误,或者在您的情况下,某些值在导入时将是未定义的。我建议将共享代码移到单独的文件中。 -
是的...我有一种感觉,这可能是解决办法。对共享文件的命名约定有何建议?
-
我不熟悉 TypeScript 和 TS 社区的最佳实践,但我会将接口移动到一个单独的文件中(可能每个文件一个接口,但请查看 TS 文档的建议)。我也不确定
sharedFunction1的用途,所以我不知道如何为它调用文件。 -
@MichaelRadionov 仅供参考,确实修复了它;一定是 ts-jest (github.com/kulshekhar/ts-jest) 的问题。随时提交答案,我会接受。
sharedFunction1将是 redux 文档所称的“案例函数”redux.js.org/docs/recipes/reducers/SplittingReducerLogic.html。我现在只用一些通用的东西。感谢您的帮助
标签: typescript redux jestjs