import { Injectable, Inject } from '@angular/core';
import { Action, ScannedActionsSubject } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import { Operator } from 'rxjs/Operator';
import { filter } from 'rxjs/operator/filter';

@Injectable()
export class Actions<V = Action> extends Observable<V> {
  constructor(@Inject(ScannedActionsSubject) source?: Observable<V>) {
    super();

    if (source) {
      this.source = source;
    }
  }

  lift<R>(operator: Operator<V, R>): Observable<R> {
    const observable = new Actions<R>();
    observable.source = this;
    observable.operator = operator;
    return observable;
  }

  ofType(...allowedTypes: string[]): Actions<V> {
    return filter.call(this, (action: Action) =>
      allowedTypes.some(type => type === action.type),
    );
  }
}

import { Injectable, Inject } from '@angular/core';
import { Action, ScannedActionsSubject } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import { Operator } from 'rxjs/Operator';
import { filter } from 'rxjs/operator/filter';

@Injectable()
export class Actions<V = Action> extends Observable<V> {
  constructor(@Inject(ScannedActionsSubject) source?: Observable<V>) {
    super();

    if (source) {
      this.source = source;
    }
  }

  lift<R>(operator: Operator<V, R>): Observable<R> {
    const observable = new Actions<R>();
    observable.source = this;
    observable.operator = operator;
    return observable;
  }

  ofType(...allowedTypes: string[]): Actions {
    return filter.call(this, (action: Action) =>
      allowedTypes.some(type => type === action.type),
    );
  }
}

--- 
+++ 
@@ -21,7 +21,7 @@
     return observable;
   }
 
-  ofType(...allowedTypes: string[]): Actions {
+  ofType(...allowedTypes: string[]): Actions<V> {
     return filter.call(this, (action: Action) =>
       allowedTypes.some(type => type === action.type),
     );
fix(Effects): Use Actions generic type for the return of the ofType operator

