Luego de mucho luchar pudimos dar con el resultado de esta cuestión que tantos usuarios de este sitio web presentan. Si tienes algo que aportar puedes aportar tu comentario.
Solución:
Los parámetros de la superclase deben repetirse y pasarse a la superllamada:
@Injectable()
export class ChildService extends ParentService
constructor (http:Http, customService:CustomService)
super(http, customService);
Hay algunos “trucos” para solucionar, como la herencia y la inyección de dependencia.
Simplemente haga el servicio base… no-@Injectable()
! Por ejemplo, debe proporcionar un método para recuperar el perfil de usuario en LoginService
. Este método será diferente para diferentes instancias de LoginService
, y la clase principal no debe saber nada acerca de la procedencia de este método: puede ser lambda, puede ser una función exportada, puede ser un método de otro servicio. Para lograr esto, puede declarar el servicio principal cuyo servicio principal:
// Don't annotate it with @Injectable() ! It's a simple class.
export abstract class BaseLoginService {
constructor(
// This won't be injected automatically,
// child class must call super() and provide value for this argument.
// Note: it's private, can't be accessed outside of BaseLoginService class
private http: HttpClient,
// Method used to retrieve user profile
private profileGetter: () => Observable,
private router: Router
)
this.profileGetter().subscribe(); // Do something with this method
Luego extiéndalo en la clase infantil:
// Child class must be annotated with @Injectable(),
// if you don't need to extend it further
@Injectable()
export class LoginService extends BaseLoginService {
constructor(
// Note: no public/private/protected here - "http"
// will be just an argument
http: HttpClient,
private profileService: ProfileService, // This is the private field of LoginService class
router: Router,
// Some service used by LoginService class, parent class BaseLoginService
// doesn't need to know about SomeOtherService
private someOtherService: SomeOtherService
)
super(
http,
// Need lambda here to capture profileService instance. If
// profileService.getUserDetailsMethod doesn't use instance
// fields or methods, then we can simply write
// "profileService.getUserDetailsMethod" (without quotes, obviously).
() => profileService.getUserDetailsMethod(),
router
);
this.someOtherService.doSomething(); // Custom initialization code
Nota: en providers
sección del módulo especificar LoginService
en lugar de padre BaseLoginService
:
providers: [
LoginService,
y usarlo en clases de componentes:
export class LoginComponent implements OnInit {
constructor(
private loginService: LoginService
)
Si necesita usar el servicio principal (por ejemplo, en componentes compartidos que solo necesitan funcionalidad de la clase de servicio principal), proporcione BaseLoginService
Por aquí:
providers: [
provide: BaseLoginService, useExisting: LoginService, // For those components which need functionality from base class only
LoginService, // Still need this one for those components which need functionality from child class
Comentarios y valoraciones del artículo
Si haces scroll puedes encontrar las aclaraciones de otros usuarios, tú además tienes el poder insertar el tuyo si te apetece.