InjectionToken
Создает токен, который можно использовать в провайдере DI.
API
class InjectionToken<T> {
constructor(_desc: string, options: { providedIn: Type<any> | "any"; factory: () => T; }): InjectionToken;
constructor(_desc: string, options?: { providedIn?: Type<any> | "any" | "root" | "platform" | null | undefined; factory: () => T; } | undefined): InjectionToken;
toString(): string;
}
constructor
2 перегрузкиstringОписание токена, используемое только для отладки; оно должно быть уникальным, но это необязательно
{ providedIn?: Type<any> | "any" | "root" | "platform" | null | undefined; factory: () => T; } | undefinedПараметры использования токена, описанные выше
InjectionToken
toString
stringstring
Описание
Создает токен, который можно использовать в провайдере DI.
Используйте InjectionToken, если тип внедряемого значения не реифицирован (не имеет представления во время выполнения), например при внедрении интерфейса, вызываемого типа, массива или параметризованного типа.
InjectionToken параметризуется типом T — типом объекта, который будет возвращен Injector. Это обеспечивает дополнительный уровень проверки типов.
Важное примечание: Убедитесь, что используете один и тот же экземпляр InjectionToken и в провайдере, и при вызове внедрения. Если создавать новые экземпляры InjectionToken в разных местах, даже с одинаковым описанием, система DI Angular будет считать их разными токенами, что приведет к NullInjectorError.
const TOKEN = new InjectionToken<MyInterface>('SomeToken');
// Setting up the provider using the same token instance
const providers = [
{provide: TOKEN, useValue: {someProperty: 'exampleValue'}}, // Mock value for MyInterface
];
// Creating the injector with the provider
const injector = Injector.create({providers});
// Retrieving the value using the same token instance
const myInterface = injector.get(TOKEN);
// myInterface is inferred to be MyInterface.
При создании InjectionToken можно также указать фабричную функцию, возвращающую значение по умолчанию (возможно, создавая его) для параметризованного типа T. Это настраивает InjectionToken с использованием этой фабрики в качестве провайдера, как если бы он был явно определен в корневом инжекторе приложения. Если фабричной функции, принимающей ноль аргументов, требуется внедрить зависимости, она может сделать это с помощью функции inject. Пример InjectionToken с поддержкой tree-shaking приведен ниже.
Кроме того, если указан factory, можно также указать параметр providedIn, который переопределяет описанное выше поведение и помечает токен как принадлежащий определенному @NgModule (примечание: этот параметр устарел). Как упоминалось выше, 'root' является значением по умолчанию для providedIn.
Параметры providedIn: NgModule и providedIn: 'any' устарели.
Примечания по использованию
Основные примеры
Обычный InjectionToken
const BASE_URL = new InjectionToken<string>('BaseUrl');
const injector = Injector.create({
providers: [{provide: BASE_URL, useValue: 'http://localhost'}],
});
const url = injector.get(BASE_URL);
// Note: since `BASE_URL` is `InjectionToken<string>`
// `url` is correctly inferred to be `string`
expect(url).toBe('http://localhost'); InjectionToken с поддержкой tree-shaking
class MyService {
constructor(readonly myDep: MyDep) {}
}
const MY_SERVICE_TOKEN = new InjectionToken<MyService>('Manually constructed MyService', {
providedIn: 'root',
factory: () => new MyService(inject(MyDep)),
});
const instance = injector.get(MY_SERVICE_TOKEN);
expect(instance instanceof MyService).toBeTruthy();
expect(instance.myDep instanceof MyDep).toBeTruthy();
Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/api/core/InjectionToken