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

Angular可选多拦截器为何注入为null?如何改为空数组?

解决Angular多注入令牌默认空数组的问题

你可以在创建InjectionToken时指定工厂函数,让它在没有配置任何提供者的情况下默认返回空数组,从根源避免null导致的报错。

修改注入令牌定义

把注入令牌的类型修正为数组类型,并添加factory选项返回空数组:

const MY_INTERCEPTORS = new InjectionToken<MyInterceptor[]>('MyInterceptors', {
  factory: () => [] // 无提供者时默认返回空数组
});

服务代码无需额外调整

原服务的构造函数注入部分保持不变即可,此时即使没有配置MY_INTERCEPTORS的提供者,interceptors也会被注入空数组,字段初始化器里的reduce方法能正常执行:

@Injectable()
export class MyService {
  constructor(
    @Inject(MY_INTERCEPTORS) private readonly interceptors: MyInterceptor[]
  ) {
    super();
  }

  public myField$(input: Foo) = this.interceptors.reduce((agg, e) => e.intercept(agg), input);
}

补充说明

  • 该方案完全兼容多提供者场景:当你配置{ provide: MY_INTERCEPTORS, useClass: X, multi: true }这类多提供者时,Angular会自动将所有匹配的实例收集成数组注入,覆盖工厂的默认空数组。
  • 无需再使用@Optional()装饰器,因为工厂已经保证了总有合法的数组值被注入。

内容的提问来源于stack exchange,提问作者Ákos Vandra-Meyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:53:09