En Angular 8 pude crear componentes base (clases de las que se hereda el componente real) con un atributo "@Injectable". El compilador de Angular 9 me dice:
El componente YourComponent hereda su constructor de BaseComponent, pero este último no tiene un decorador Angular propio. La inyección de dependencia no podrá resolver los parámetros del constructor de BaseComponent. Agregue un decorador @Directive a BaseComponent o agregue un constructor explícito a RoleSelectDialogComponent.
¿Cuál es la forma Angular 9 de hacer estas cosas ahora? Esto funciona, pero parece de alguna manera hacky:
@Component({ selector: 'baseComponent', template: 'no-ui' })La pista está en el mensaje.
Either add a @Directive decorator to BaseComponent
Agregarle una @Directive() debería funcionar.
Estoy pasando por una actualización ahora, y mi componente base automáticamente tiene agregado el decorador @Directive().
Esto probablemente afectará a más personas ahora que Angular 10 está disponible y la advertencia ahora es un error.
error NG2007: la clase usa características angulares pero no está decorada. Agregue un decorador angular explícito.
Esta entrada de blog muestra algunos ejemplos https://volosoft.com/blog/what-is-new-in-angular-10
Además, tenga en cuenta que 'Características angulares' no solo significa inyección de dependencia. Incluso la presencia de ngOnDestroy() en su clase base activará esto.
Lo resolví cambiando el nombre de ngOnDestroy() a _ngOnDestroy() y lo llamé desde la subclase en la destrucción del @Injectable() real. Esto parece un poco peligroso si volviera a subclasificarlo y me olvidara de llamar a _ngOnDestroy() pero no estoy seguro de tener muchas opciones.
Este patrón ha quedado obsoleto en v9 y ya no se admite en v10.
Hay una migración que normalmente migra estos casos automáticamente https://angular.io/guide/migration-undecorated-classes y https://angular.io/guide/migration-injectable , sin embargo, puede ser que el @Injectable heredado ( ) el caso no se maneja.
De todos modos, la resolución aquí es agregar @Injectable() a la clase base abstracta.