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];

これは機能しますが、カウンターで typescript エラーが発生しました: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;
}

実際にパラメーターなしで呼び出すことができるようにします。

既定のパラメーター値は、コンストラクターと関数の実装 (ラムダで行うように) でのみ許可されるため、インターフェイス定義で既定値を指定することはできません。

TypeScript コンパイラを呼び出すとcounter()、実際にその型 ( ) がチェックReducer<number>され、2 つのパラメーターが必要であることがわかります。

したがって、上記で提案したことを行うか、実際にデフォルトのパラメーターで呼び出します。

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

[提案}( https://github.com/ngrx/store/issues/32 ) 私が最終的に使用したのは、子レデューサーの型シグネチャのレデューサー部分を削除することでした。私は恐れていますが、あまりエレガントではありません。

于 2016-02-08T15:29:27.677 に答える