Dev Study
← Angular コース

53. InjectionToken — クラスではない値を配る

DIで配れるのはサービスクラスだけではありません。設定オブジェクトやAPIのベースURLのような「ただの値」も配れます。ただし値には型の実体(クラス)がないため、DIの目印として InjectionToken を作ります。new InjectionToken<string>('api.base.url') のように名前を付けて定義します。

配る側は providers に { provide: API_BASE_URL, useValue: 'https://api.example.com' } と登録し、受け取る側は inject(API_BASE_URL) と書きます。実務では、開発環境と本番環境でAPIのURLを切り替えたいときや、ライブラリに設定を渡したいときの定番手段です。値の出どころが1か所にまとまるのが利点です。

つまずきやすいのは、トークンを定義しただけで providers への登録を忘れるケースです。登録がないと実行時に NullInjectorError になります。また、inject(API_BASE_URL) の戻り値の型はトークンの型引数(この例では string)で決まるため、定義時に型引数を必ず付けておきましょう。

サンプルコード(フレームワーク環境が必要なため表示のみ)

import { InjectionToken, inject, Component } from '@angular/core';

// 「APIのベースURL」というDIの目印を作る(型引数で型を決める)
export const API_BASE_URL = new InjectionToken<string>('api.base.url');

// アプリ起動時の providers で値を登録する:
// bootstrapApplication(App, {
//   providers: [{ provide: API_BASE_URL, useValue: 'https://api.example.com' }],
// });

@Component({
  selector: 'app-user-list',
  template: '<p>接続先: {{ baseUrl }}</p>',
})
export class UserList {
  // クラスと同じ書き方で「値」を受け取れる(型は string になる)
  baseUrl = inject(API_BASE_URL);
}
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗