我想我错过了一些明显的尝试使用@ngrx的东西。我试图使用嵌套的reducer,并希望能够返回默认的起始子值。这是我的孩子
export const counter:Reducer<number> =
(state:number = 0, action:Action = {type:null}) => {
switch (action.type) {
我的问题是如何使用它来初始化一个额外的计数器。我的counter.ts看起来像
export const counters:Reducer<number[]> = (state:number[] = [], action:Action) => {
switch (action.type) {
case ADD_COUNTER:
return [counter(), ...state];
这样可行,但我在计数器上有一个打字稿错误:Supplied parameters do not match any signature of call target
我想知道如何解决这个问题。
我正在使用@ngrx,它提供了这个:
export interface Action {
type: string;
payload?: any;
}
export interface Reducer<T> {
(state: T, action: Action): T;
}
export class Store<T> extends BehaviorSubject<T> {
private _storeSubscription: Subscription<T>
constructor(private _dispatcher:Dispatcher<Action>, private _reducers:{[key:string]:Reducer<any>}, initialState: T) {
super(initialState);
let rootReducer = this._mergeReducers(_reducers, initialState);
this._storeSubscription = rootReducer.subscribe(this);
}
答案 0 :(得分:1)
export interface Reducer<T> {
(state?: T, action?: Action): T;
}
的定义应为
counter()
实际上允许在没有参数的情况下调用它。
默认参数值仅在构造函数和函数实现中允许(就像在lambda中一样),因此您不能在接口定义中指定默认值。
当您调用Reducer<number>
时,TypeScript编译器将实际检查其类型(counter(0, {type: null})
),并会看到需要两个参数。
所以你要么做我上面建议的,要么用默认参数调用它:
requests
答案 1 :(得分:0)
我最终使用的[suggestion}(https://github.com/ngrx/store/issues/32)是删除减少子类型签名的Reducer部分。虽然我担心,但不是很优雅。