在RxJS与Angular中,Subject是否需要使用$符号作为后缀?
给Subject加$后缀没有实质弊端,反而在大多数场景下是更统一、更利于维护的命名习惯。
$后缀的规范本质
首先要明确,RxJS社区包括Angular官方提倡的$后缀,核心作用是标记「可订阅的流类型」,不是专门给Observable独有的标记。官方规范里只提Observable的原因很简单:Observable是所有流类型的公共父类,大多数业务场景下对外暴露的流类型都是Observable,没专门提Subject不代表Subject不能用。
Angular官方的样式指南里提到$后缀的初衷,是为了让开发者在模板或者业务代码里一眼区分普通值和需要订阅的流,避免出现把
user$直接当user对象访问属性的低级错误。
Subject本身是Observable的子类,满足「需要订阅、是异步流」的特征,完全符合$后缀的设计目的,加$完全合理。
为什么很少看到有人给Subject加$
主要是开发习惯的问题,常见的场景里Subject通常是类的内部私有变量,只会在类内部调用next()/error()/complete()方法,对外暴露的通常是调用Subject的asObservable()方法转成的纯Observable,很多团队的习惯是:
- 内部私有Subject不加$,命名比如
private userSubject = new BehaviorSubject(null) - 对外暴露的Observable加$,比如
public user$ = this.userSubject.asObservable()
但这只是团队约定的范畴,不是必须遵守的硬性规则。如果你团队的代码里有很多直接对外暴露Subject、或者内部使用Subject也需要和普通变量区分的场景,统一给所有可订阅类型(包括Subject、BehaviorSubject、ReplaySubject等)都加$,完全没问题。
唯一需要注意的争议点
如果你的团队有明确的约定,用$后缀专门区分「只读的Observable」和「可写入的Subject」,那给Subject加$会破坏这个约定,这种情况下建议和团队统一规则就好,不属于命名本身的弊端。
总结
只要团队内部达成一致,给Subject加$是非常合理的做法,没有任何功能层面的问题,反而能提升代码的可读性,避免类型混淆。
内容的提问来源于stack exchange,提问作者Piotr Bartoch

