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
相关产品推荐
相关产品推荐

