Injectable | Angular
- Injectable | Angular

No Angular, os decoradores @Optional(), @Host(), @SkipSelf() e @Inject() são usados no contexto de injeção de dependência para controlar como e de onde os serviços são injetados nos componentes ou diretivas. Aqui está uma explicação detalhada sobre cada um deles:
1. @Optional()
- O que faz? Indica que a dependência pode ser opcional.
- Quando usar? Quando o serviço pode ou não estar disponível, evitando erros caso ele não esteja presente.
- Exemplo:
Se
constructor(@Optional() private service: SomeService) {
if (!service) {
console.log('SomeService não foi encontrado.');
}
}SomeServicenão estiver registrado no provedor, o valor injetado seránullem vez de lançar um erro.
2. @Host()
- O que faz? Força o Angular a buscar a dependência apenas no componente ou diretiva hospedeira (onde a diretiva está sendo usada).
- Quando usar? Quando você quer garantir que a dependência vem diretamente do componente/diretiva onde a injeção ocorre e não de ancestrais na hierarquia de injeção.
- Exemplo:
Isso impede que o Angular procure
constructor(@Host() private service: SomeService) {}SomeServiceem módulos pais, garantindo que o serviço seja fornecido somente no componente hospedeiro.
3. @SkipSelf()
- O que faz? Diz ao Angular para não buscar a dependência no próprio componente, mas sim no seu pai.
- Quando usar? Quando um serviço pode estar registrado tanto localmente quanto em um nível superior e você quer forçar a busca no pai.
- Exemplo:
Isso significa que, se
constructor(@SkipSelf() private service: SomeService) {}SomeServiceestiver no mesmo componente onde essa injeção ocorre, ele será ignorado, e a busca será feita no nível superior da árvore de injeção.
4. @Inject()
- O que faz? Permite especificar manualmente um token para injeção, útil quando não é possível inferir o tipo do serviço automaticamente.
- Quando usar? Quando o serviço usa tokens de injeção personalizados (por exemplo, valores primitivos ou classes abstratas).
- Exemplo:
Neste caso,
constructor(@Inject('API_URL') private apiUrl: string) {
console.log(`API URL: ${apiUrl}`);
}API_URLpode ser um InjectionToken definido em outro lugar:import { InjectionToken } from '@angular/core';
export const API_URL = new InjectionToken<string>('API_URL');
@NgModule({
providers: [{ provide: API_URL, useValue: 'https://api.example.com' }]
})
Resumo:
| Decorador | O que faz? | Quando usar? |
|---|---|---|
@Optional() | Torna a dependência opcional (se não for encontrada, injeta null). | Quando um serviço pode ou não estar disponível. |
@Host() | Busca a dependência apenas no componente ou diretiva hospedeira. | Quando quer evitar que a dependência seja buscada em níveis superiores. |
@SkipSelf() | Pula o componente atual e busca a dependência no nível superior. | Quando há um serviço local, mas quer usar a versão de um pai. |
@Inject() | Injeta manualmente um valor usando um token específico. | Quando o tipo não pode ser inferido automaticamente (ex: valores primitivos, interfaces). |