Angular 15工厂提供者报错:需为布尔参数指定注入令牌
Angular 15工厂提供者注入错误问题解决
核心问题原因
Angular 15 对依赖注入(DI)的类型检查规则进行了严格升级:**非类类型的依赖(如字符串、布尔值这类原始类型)**不再允许隐式推断注入令牌,必须通过@Inject()装饰器显式指定对应的注入标识,否则DI系统无法识别依赖来源,抛出"无合适注入令牌"的错误。而旧版本Angular对这类隐式场景存在兼容处理,因此之前能正常运行。
分步解决方案
1. 创建注入令牌
先为原始类型的依赖定义专用注入令牌,使用InjectionToken:
import { InjectionToken } from '@angular/core'; // 为字符串参数创建令牌 export const FACTORY_NAME_TOKEN = new InjectionToken<string>('factoryName'); // 为布尔值参数创建令牌 export const IS_FACTORY_TOKEN = new InjectionToken<boolean>('isFactory');
2. 修改FactoryService构造函数
在构造函数中,对非类类型的参数添加@Inject()装饰器,绑定对应的令牌:
import { Injectable, Inject } from '@angular/core'; import { FACTORY_NAME_TOKEN, IS_FACTORY_TOKEN } from './tokens'; // 引入令牌 @Injectable() export class FactoryService { constructor( @Inject(FACTORY_NAME_TOKEN) public name: string, @Inject(IS_FACTORY_TOKEN) public isFactory: boolean ) {} }
3. 配置工厂提供者
在模块/组件的providers数组中,关联令牌与对应值,并在工厂函数中声明依赖顺序:
import { NgModule } from '@angular/core'; import { FactoryService, FACTORY_NAME_TOKEN, IS_FACTORY_TOKEN } from './factory.service'; @NgModule({ providers: [ { provide: FACTORY_NAME_TOKEN, useValue: 'factory' }, { provide: IS_FACTORY_TOKEN, useValue: true }, { provide: FactoryService, useFactory: (name: string, isFactory: boolean) => new FactoryService(name, isFactory), deps: [FACTORY_NAME_TOKEN, IS_FACTORY_TOKEN] // 严格对应工厂函数的参数顺序 } ] }) export class AppModule {}
4. 在HomeComponent中正常使用
此时注入FactoryService后即可正常获取预期值:
import { Component } from '@angular/core'; import { FactoryService } from './factory.service'; @Component({ selector: 'app-home', template: ` <p>名称: {{ factoryService.name }}</p> <p>是否为工厂类型: {{ factoryService.isFactory }}</p> ` }) export class HomeComponent { constructor(public factoryService: FactoryService) {} }
规则复盘
Angular的DI系统默认以类本身作为注入令牌,但原始类型没有类标识,旧版本的隐式推断属于兼容行为。Angular 15开始严格遵循DI规范,要求所有依赖必须有明确的注入标识,因此必须通过InjectionToken+@Inject()的组合来声明原始类型依赖。
内容的提问来源于stack exchange,提问作者Rupo
相关产品推荐
相关产品推荐

