Tengo una clase abstracta que ayuda a evitar el código repetitivo (para cancelar la suscripción de observables), se ve así:
export abstract class SubscriptionManagmentDirective implements OnDestroy { componetDestroyed = new Subject<void>() constructor() {} ngOnDestroy(): void { this.componetDestroyed.next() this.componetDestroyed.unsubscribe() } } En algunos casos, sucedió que ngOnDestroy y olvidé llamar a super.ngOnDestroy() y luego las suscripciones se volvieron locas. Agregué una prueba de unidad a los componentes de extensión para probar que se han cancelado las suscripciones, pero para hacerlo, tengo que recordar agregarlos.
Mi pregunta es,
super.ngOnDestroy() cada vez que se extienda el componente?Cualquier ayuda será apreciada, gracias.
Creo que el mejor enfoque para esto sería agregar "noImplicitOverride": true to your tsconfig. No necesariamente lo ayudará a recordar llamar a un supermétodo, pero lo obligará a ser explícito acerca de la anulación de métodos, arrojando un error de compilación en los casos en que anule un método sin usar la palabra clave override . Luego, depende del desarrollador decidir si el supermétodo debe llamarse o no.
Solo puedo pensar en una forma, muy rara y fea. Una cosa que se aplica es la llamada super() en el constructor, por parte de TypeScript. Por lo tanto, podrías
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();Como dije, hacky y feo.
No, no existe tal forma de llamar automáticamente al método desde un resumen.
Tienes que hacer pruebas unitarias solo de forma aislada. Simplemente cree una clase de prueba en línea que amplíe su resumen y luego pruebe la unidad ngOnDestroy . Es totalmente suficiente.