Angular 4.3.4中@Inject(Injector)与injector的写法差异问询
嘿,咱们来好好聊聊Angular 4.3.4里这两种注入Injector的写法到底有啥区别——或者说是不是真的有区别!
1. 常规场景下:功能完全等价
首先明确:如果只是注入Injector这种类类型的依赖,这两种写法最终的效果是一模一样的,Angular的DI系统都会给你注入正确的Injector实例:
- 简化写法:
constructor(private injector: Injector) {} - 显式标注写法:
constructor(@Inject(Injector) private injector: Injector) {}
在Angular 4.3.4版本里,DI系统已经能通过参数的类型自动推断出要注入的依赖令牌,所以省略@Inject()完全没问题,拿到的实例和显式标注的是同一个。
2. 差异点:适用场景不同
那为啥会有两种写法?其实是为了覆盖不同的注入场景:
必须用@Inject的情况:当你注入的不是类类型的依赖时——比如注入字符串令牌、
InjectionToken,或者需要指定别名提供者、可选依赖的时候,就必须显式用@Inject()来声明要注入的令牌。举个例子:// 自定义InjectionToken的场景,必须用@Inject const API_BASE_URL = new InjectionToken<string>('apiBaseUrl'); constructor(@Inject(API_BASE_URL) private apiUrl: string) {}而
Injector本身是类,所以Angular能自动识别,这时候@Inject()就成了可选的。代码风格与可读性:有些团队或者开发者偏爱显式写
@Inject(Injector),这样即使不看参数类型,也能一眼看出这里注入的是什么依赖,在复杂的组件/服务类里,能让依赖关系更清晰,减少阅读代码的负担。
3. 版本相关的小细节
在Angular 4.3.4这个版本里,基于类型推断的DI机制已经非常成熟了,所以对于类类型的依赖,省略@Inject()不会有任何兼容性问题。要是在更早的Angular 2早期版本,可能某些边缘场景下需要显式标注,但4.3.4完全不需要担心。
总结
简单来说:这两种写法不是“同一功能的不同实现模式”,而是同一功能的简化写法与通用显式写法。注入Injector这种类依赖时,二者功能100%等价;显式写法的优势在于能覆盖所有注入场景,而简化写法是Angular为类类型依赖提供的语法糖。选哪种主要看你团队的代码风格偏好~
内容的提问来源于stack exchange,提问作者xkeshav

