如何将字符串转换为类注入器令牌?Angular注入问题咨询
问题解答
你遇到的核心问题是:类本身就是Angular的注入令牌,而你创建的InjectionToken是完全独立的另一个令牌——哪怕它的名字和类名一致,Angular的注入系统也不会自动关联两者,所以会抛出NullInjectorError。
不存在直接把字符串“转换”为类注入令牌的方法,但可以通过以下两种方式实现你想要的效果:
方式一:将自定义令牌与类提供者关联
在模块或组件的providers配置中,把你创建的InjectionToken映射到已有的类提供者:
const token = new InjectionToken<any>('SomeClass'); // 在模块/组件的providers数组中添加映射 @NgModule({ providers: [ SomeClass, // 注册类本身的提供者 { provide: token, useExisting: SomeClass } // 让自定义令牌复用类的实例 ] }) export class YourModule {}
之后调用injector.get(token)就能获取到和injector.get(SomeClass)相同的实例。
方式二:维护字符串到类的映射表
如果你需要通过动态字符串获取对应的类令牌,可以提前维护一个映射关系:
// 定义字符串到类的映射 const classTokenMap: Record<string, Type<any>> = { 'SomeClass': SomeClass, // 可以添加更多类的映射 }; // 使用时通过字符串获取类令牌 const targetToken = classTokenMap['SomeClass']; const instance = injector.get(targetToken);
这种方式需要你提前将所有可能用到的类加入映射表,适合动态注入的场景。
补充说明
Angular的注入系统是基于令牌引用来匹配提供者的:SomeClass类的引用是一个唯一令牌,而new InjectionToken('SomeClass')创建的是另一个全新的令牌对象,两者在注入系统中完全不相关,这就是你报错的根本原因。
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

