Spec-Zone.ru › Angular

InjectionToken

Создает токен, который можно использовать в провайдере DI.

Что такое InjectionToken?

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 перегрузки
@deprecated

Параметры providedIn: NgModule или providedIn:'any' устарели. Используйте другую сигнатуру.

@param_descstring
@paramoptions{ providedIn: Type<any> | "any"; factory: () => T; }
@returnsInjectionToken
@param_descstring

Описание токена, используемое только для отладки; оно должно быть уникальным, но это необязательно

@paramoptions{ providedIn?: Type<any> | "any" | "root" | "platform" | null | undefined; factory: () => T; } | undefined

Параметры использования токена, описанные выше

@returnsInjectionToken

toString

string
@returnsstring

Описание

Создает токен, который можно использовать в провайдере 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API