You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular中定义可选的InjectionToken?

如何将Angular的InjectionToken设置为可选?

有两种常用方式可以让你的MY_TOKEN成为可选注入令牌,避免未提供时的报错:

方法一:使用@Optional()装饰器

在注入MY_TOKEN时加上@Optional()装饰器,当没有任何提供者提供该令牌时,Angular会注入null而非抛出错误。注意要在代码里处理空值情况:

import { Optional, Inject, InjectionToken, Injectable } from '@angular/core';

export const MY_TOKEN = new InjectionToken<string[]>('MY_TOKEN');

@Injectable({ providedIn: 'root' })
export class DemoService {
  constructor(
    @Optional() @Inject(MY_TOKEN) public myTokenData: string[] | null,
  ) {
    // 兜底处理空值,比如设为默认空数组
    this.myTokenData = myTokenData ?? [];
  }
}

方法二:给InjectionToken设置默认值

创建InjectionToken时直接指定默认值,这样即使没有应用显式提供该令牌,Angular会自动使用你定义的默认值,无需额外处理空值:

import { Inject, InjectionToken, Injectable } from '@angular/core';

// 创建令牌时设置默认空数组
export const MY_TOKEN = new InjectionToken<string[]>('MY_TOKEN', {
  providedIn: 'root',
  factory: () => []
});

@Injectable({ providedIn: 'root' })
export class DemoService {
  constructor(
    @Inject(MY_TOKEN) public myTokenData: string[],
  ) {}
}

两种方式的区别

  • @Optional()更灵活,允许你在不同场景下决定是否提供令牌,但需要自行处理空值逻辑。
  • 给令牌设置默认值更省心,适合有明确默认行为的场景,无需额外判断空值。

内容的提问来源于stack exchange,提问作者Domske

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:18:29