Subject 需要 RxJS6 asObservable() 吗?

RxJS6 asObservable() needed on a Subject?

Subject(例如 BehaviorSubject)什么时候需要 asObservable() 才能获得该主题的可观察值?主题本身也可以转换为 Observable。

问题

  1. name1$name2$ 之间的技术差异是什么?
  2. 应该使用哪一个(name1$name2$)?

代码示例

import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs';

export class Person {
  private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');

  public get name1$(): Observable<string> {
    return this.nameSubject.asObservable();
  }

  public get name2$(): Observable<string> {
    return this.nameSubject;
  }

  public setName(value: string): void {
    this.nameSubject.next(value);
  }
}

提前感谢您的回答!

没有太大区别,与asObservable()主要只是阻止你访问观察者方法——completenexterror以防止你不小心调用他们

const a = new Subject();
console.log(a.asObservable().next)
// undefined

最好 return asObservable() 为了安全起见,如果您不使用该特定流作为观察者

asObservable() 创建了一个新的 Observable,它包装了 Subject,所以包装的 observable 没有 next() 方法,以及 complete()error()。我认为它在 JavaScript 中更有意义,其中返回的对象不受其类型的限制。但是在 TypeScript 中,你可以通过缩小类型来隐藏这些方法,在大多数情况下应该足够了。您只是告诉我们返回了一个 Observable 而 API 的用户不知道它是一个 Subject;当然它可以转换回 Subject,但这不是应该使用 API 的方式。

另请参阅:

一般情况下,建议只在JavaScript中使用RxJS时才使用asObservable()。使用 TypeScript,您可以只使用类型转换,它不会让您调用 next() 等等。

private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public nameSubject$: Observable<string> = this.nameSubject;

这是在 TypeScript 中将 Subjects 转换为 Observables 的官方推荐方式。
有关详细信息,请参阅 https://github.com/ReactiveX/rxjs/pull/2408#issuecomment-282077506