1

我想我在尝试使用@ngrx时遗漏了一些明显的东西。我正在尝试使用嵌套的减速器,并希望能够返回默认的起始子值。这是我的孩子

export const counter:Reducer<number> = 
    (state:number = 0, action:Action = {type:null}) => {

    switch (action.type) {

我的问题是如何使用它来初始化一个额外的计数器。我的 counters.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);
    }
4

2 回答 2

1

的定义Reducer应该是

export interface Reducer<T> {
    (state?: T, action?: Action): T;
}

实际上允许在没有参数的情况下调用它。

默认参数值只允许在构造函数和函数实现中使用(就像您在 lambda 中所做的那样),因此您不能在接口定义中指定默认值。

当你调用counter()TypeScript 时,编译器实际上会检查它的类型 ( Reducer<number>) 并且会看到需要两个参数。

因此,您要么按照我上面的建议进行操作,要么使用默认参数实际调用它:

counter(0, {type: null})
于 2016-02-07T21:23:35.507 回答
0

我最终使用的 [建议}( https://github.com/ngrx/store/issues/32 ) 是删除子减速器类型签名的减速器部分。虽然我担心不是很优雅。

于 2016-02-08T15:29:27.677 回答