【问题标题】:How to force call `super.ngOnDestroy`如何强制调用`super.ngOnDestroy`
【发布时间】:2021-11-30 01:26:44
【问题描述】:

我有一个抽象类,有助于避免重复代码(取消订阅 observables),它看起来像:

export abstract class SubscriptionManagmentDirective implements OnDestroy {
  componetDestroyed = new Subject<void>()

  constructor() {}

  ngOnDestroy(): void {
    this.componetDestroyed.next()
    this.componetDestroyed.unsubscribe()
  }
}

在某些情况下,我会覆盖 ngOnDestroy 并忘记调用 super.ngOnDestroy(),然后订阅变得疯狂。 我向扩展组件添加了一个单元测试,以测试取消订阅已被调用,但为此我必须真正记住添加它们。

我的问题是,

  • 有没有办法强制在组件扩展时调用super.ngOnDestroy()
  • 或者有没有办法为抽象类编写单元测试,以便在扩展该类的任何组件上进行测试?

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: angular typescript jasmine observable abstract-class


    【解决方案1】:
    1. 不,没有这种方法可以从抽象中自动调用方法。

    2. 您必须单独进行单元测试。只需创建一个扩展您的抽象的内联测试类,然后对ngOnDestroy 进行单元测试。完全够了。

    【讨论】:

      【解决方案2】:

      我只能想到一种方法,非常笨拙和丑陋。 强制执行的一件事是由 TypeScript 本身在构造函数中调用 super()。因此你可以

      class Foo {
        constructor() {
          const oldNgOnDestroy = this.ngOnDestroy;
      
          this.ngOnDestroy = function() {
            console.log("decorated ngOnDestroy");
            return oldNgOnDestroy();
          }.bind(this);
        }
      
        ngOnDestroy() {
          console.log("original ngOnDestroy");
        }
      }
      
      class Bar extends Foo {
        constructor() {
          super();
        }
      }
      
      class Baz extends Foo {
        constructor() {
          super();
        }
      
        ngOnDestroy() {
          console.log("custom ngOnDestroy");
        }
      }
      
      const bar = new Bar();
      bar.ngOnDestroy();
      const baz = new Baz();
      baz.ngOnDestroy();

      正如我所说的那样,既老套又丑陋。

      【讨论】:

        【解决方案3】:

        我认为最好的方法是将"noImplicitOverride": true 添加到您的 tsconfig 中。它不一定会帮助您记住调用超级方法,但它会迫使您明确说明重写方法,如果您在不使用 override 关键字的情况下重写方法,则会引发编译错误。然后由开发人员决定是否需要调用超级方法。

        https://www.typescriptlang.org/tsconfig#noImplicitOverride

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-04
          • 1970-01-01
          相关资源
          最近更新 更多