エラー百科辞典

inject() must be called from an injection context

inject 関数を許可されていない注入コンテキスト の外で使用しようとすると、このエラーが表示されます。注入コンテキストは、クラスの作成と初期化時に使用できます。 また、runInInjectionContext で使用される関数でも使用できます。

実際には、inject() の呼び出しは、コンストラクター、コンストラクターパラメーター、フィールドイニシャライザーで許可されます。

@Injectable({providedIn: 'root'})
export class Car {
  radio: Radio | undefined;

  // OK: フィールドイニシャライザー
  spareTyre = inject(Tyre);

  constructor() {
    // OK: コンストラクターボディ
    this.radio = inject(Radio);
  }
}

また、プロバイダーのファクトリーから inject を呼び出すことも合法です。

providers: [
  {
    provide: Car,
    useFactory: () => {
      // OK: クラスファクトリー
      const engine = inject(Engine);
      return new Car(engine);
    },
  },
];

クラスの作成または runInInjectionContext の外での inject 関数への呼び出しは、エラーになります。特に、inject() への呼び出しは、クラスインスタンスが作成された後、メソッド(ライフサイクルフックを含む)では許可されません。

@Component({ ... })
export class Car {
  ngOnInit() {
    // ERROR: 遅すぎる、コンポーネントインスタンスはすでに作成されています
    const engine = inject(Engine);
    engine.start();
  }
}

エラーのデバッグ

エラーのスタックトレースをたどり、許可されていない inject() への呼び出しが行われている場所を特定します。

エラーを修正するには、inject の呼び出しを許可されている場所(通常はクラスコンストラクターまたはフィールドイニシャライザー)に移します。

NOTE: テストコンテキストで実行している場合は、TestBed.runInInjectionContext を使用すると、inject() が成功します。

TestBed.runInInjectionContext(() => {
  // ...
});