使用BehaviourSubject,对象可能是“未定义”的

时间:2018-07-12 14:22:10

标签: angular typescript

我有一个BehaviourSubject,例如:

public _position: BehaviorSubject<Position | undefined> = new BehaviorSubject(undefined);
public position$: Observable<Position | undefined> = this._position.asObservable();
public get position() {
  return this._position.getValue();
}

我想这样使用:

this.position$.subscribe((position) => {
  if (typeof position !== 'undefined') {
    let latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
  }
});

但是无论我如何尝试,我仍然会看到Typescript错误:

  

[ts]对象可能是'undefined'。

position.coords.latitudeposition.coords.longitude

我不明白。我已指定类型可以为Positionundefined。我给了它一个初始的undefined值。我还使用typeof position !== 'undefined'来保护变量。这是怎么回事?

2 个答案:

答案 0 :(得分:1)

TypeScript有时会一无所获。.

你能尝试

this.position$.subscribe((position) => {
  if (position && position.coords) {
    let latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
  }
});

答案 1 :(得分:1)

不确定为什么打字稿会显示该错误,但可以使代码更简洁:

如果您使用rxjs> 5,则可能必须重写过滤器并映射

public _position: BehaviorSubject<Position> = new BehaviorSubject(null);
public position$: Observable<Position> = this._position.asObservable();
public get position() {
  return this._position.getValue();
}

this.position$
    .filter(Boolean)
    .map(position => position.coords)
    .subscribe((coords) => {
        let latLng = new google.maps.LatLng(coords.latitude, coords.longitude);
});