打字稿:过滤BehaviourSubjet asObservable

时间:2016-12-07 01:38:51

标签: angular typescript observable behaviorsubject

我对角度很陌生,我想知道在这种情况下我失踪了什么:

在服务中,我创建了一个BehaviorSubject来存储Websocket事件:

@Injectable()
export class GlobalEvent {
  private _events: BehaviorSubject<IWSEvent[]> = new BehaviorSubject([]);
  private socket;
  constructor() {
    this.socket = io(AppConfig.websocketClient);
    this.socket.on('event', (data: IWSEvent) => {
      const collection = this._events.value;
      collection.push(data.msg.object);
      this._events.next(collection);
    });
  }

  list() {
    return this._events.asObservable();
  }

}

然后在另一项服务中,我订阅了Observable我正在返回:

@Injectable()
export class InstanceStore {
  constructor(private instanceService: InstanceService, private globalEvent: GlobalEvent) {
    this.globalEvent.list()
      .filter((e) => {
        return e.model === 'Instance';
      })
      .subscribe(
        (data: IWSEvent[]) => {
          const event = data[data.length - 1];
          console.log(event, data);
        }
      );
  }
}

但我在过滤器函数中收到错误:Property 'model' does not exist on type 'IWSEvent[]'.,而我期望找到一个IWSEvent作为过滤器函数的参数,而不是数组。

我不理解的是什么?

由于

1 个答案:

答案 0 :(得分:1)

看起来你的类型不匹配。您有一个BehaviorSubject<IWSEvent[]>,会为每个IWSEvent[]电话发送next()个实例,但您的过滤器似乎是为IWSEvent的单个实例编写的。

从它看起来你真的不想将你的事件存储在一个数组中但只有一个BehaviorSubject<IWSEvent>的流,那么你的过滤器将按预期工作,你不需要抓住最后一项订阅方法中的数组。