首页 > 解决方案 > 吸气剂构造可以在没有相关属性的情况下存在吗?

问题描述

例如,我有这样的代码

get isChart(): Observable<boolean> {
  return this.isTemperatureChart.pipe(
    withLatestFrom(this.isHypertensionChart),
    map(([isTemperatureChart, isHypertensionChart]) => isTemperatureChart || 
         isHypertensionChart)
  );
}

或用于简化

get isChart(): boolean {
  return this.isTemperatureChart && this.isSomeOtherPropertyTrue
}

很长一段时间,对我来说,很明显,如果我有复杂的二进制逻辑,并且不需要任何来自外部的属性,我应该使用过程。只是为了清晰的代码,我一直尝试使用吸气剂。但现在我想,关于这种结构的性质,找不到正确的答案。可以吗,仅将 getter 用于 GETTING,而不将其与某些类属性相关联?还是不是根据 OOP 和 getter/setter 的规范 - 仅用于封装类属性?

标签: angulartypescriptoopgetter-settergetter

解决方案


您返回原始值的第二个示例是绝对正确的,但是您的第一个示例会导致问题,因为Observable每次查询该属性时它都会创建一个新的(如果您async在模板中使用管道,它会与它一起订阅)。使用 angular,这将是该组件的每个更改检测周期,并且每次您在组件 ts 中查询它。

在这种情况下,你真的不应该使用 getter。如果您希望消费者防止覆盖可观察对象,而只是读取它,则应设置readonly访问修饰符。这会将您的示例更改为:

readonly isChart$: Observable<boolean> = this.isTemperatureChart.pipe(
  withLatestFrom(this.isHypertensionChart),
  map(([isTemperature, isHypertension]) => isTemperature || isHypertension)
);

不知道你的代码,但从变量的命名来看,感觉你最好使用combineLatest而不是withLatestFrom


推荐阅读