inject
Injects a token from the currently active injector.
inject
is only supported in an injection context. It
can be used during:
- Construction (via the
constructor
) of a class being instantiated by the DI system, such as an@Injectable
or@Component
. - In the initializer for fields of such classes.
- In the factory function specified for
useFactory
of aProvider
or an@Injectable
. - In the
factory
function specified for anInjectionToken
. - In a stackframe of a function call in a DI context
API
function inject<T>(token: ProviderToken<T>): T;
function inject<T>(
token: ProviderToken<T>,
options: InjectOptions & { optional?: false | undefined },
): T;
function inject<T>(token: ProviderToken<T>, options: InjectOptions): T | null;
function inject(token: HostAttributeToken): string;
function inject(
token: HostAttributeToken,
options: { optional: true },
): string | null;
function inject(
token: HostAttributeToken,
options: { optional: false },
): string;
function inject<T>(token: ProviderToken<T>): T;
T
function inject<T>(token: ProviderToken<T>, options: InjectOptions & { optional?: false | undefined; }): T;
T
function inject<T>(token: ProviderToken<T>, options: InjectOptions): T | null;
T | null
function inject(token: HostAttributeToken): string;
HostAttributeToken
A token that represents a static attribute on the host node that should be injected.
string
function inject(token: HostAttributeToken, options: { optional: true; }): string | null;
HostAttributeToken
A token that represents a static attribute on the host node that should be injected.
{ optional: true; }
string | null
function inject(token: HostAttributeToken, options: { optional: false; }): string;
HostAttributeToken
A token that represents a static attribute on the host node that should be injected.
{ optional: false; }
string
Usage Notes
In practice the inject()
calls are allowed in a constructor, a constructor parameter and a
field initializer:
@Injectable({providedIn: 'root'})
export class Car {
radio: Radio|undefined;
// OK: field initializer
spareTyre = inject(Tyre);
constructor() {
// OK: constructor body
this.radio = inject(Radio);
}
}
It is also legal to call inject
from a provider's factory:
providers: [
{provide: Car, useFactory: () => {
// OK: a class factory
const engine = inject(Engine);
return new Car(engine);
}}
]
Calls to the inject()
function outside of the class creation context will result in error. Most
notably, calls to inject()
are disallowed after a class instance was created, in methods
(including lifecycle hooks):
@Component({ ... })
export class CarComponent {
ngOnInit() {
// ERROR: too late, the component instance was already created
const engine = inject(Engine);
engine.start();
}
}