一个简单的问题,我认为答案可能很复杂。
在Angular中,我可以为组件中的类构造函数指定可变数量的参数。通过向参数添加类型,Angular神奇地知道应该将哪个实例作为依赖项传递。
export class HomeComponent {
constructor(private utils: Utils) {} // Angular knows its a Utils instance just by type
}
即使使用了注入令牌和Angular使用的其他时髦的东西,我也认为类型在编译时被剥离了,完全被忽略了。Angular是如何通过类型来知道应该注入哪个实例的?
这是网络包的东西吗?是否有我不知道的TypeScript功能?怎么回事?
在这里的Angular文档中,它说:
用@Injectable标记类可以确保编译器在注入类时生成必要的元数据来创建类的依赖项。
这种行为是在组件装饰器中定义的,还是即使不需要依赖注入,它也会为每个类创建元数据?这是什么TypeScript功能?
从本质上讲,最好的答案是可以帮助我将依赖注入融入到我自己的项目中,而这些项目不是Angular。
我很抱歉没有尽快给出答案,但自从编写了上面的问题以来,我在依赖注入方面积累了很多经验,并且可以提供关于它如何工作的高级概述。
警告:截至本文撰写之时,TypeScript装饰器正处于ECMAScript提案的第3阶段,这是一个重要的注意事项,因为装饰器将在未来成为正式的JS功能,因此随着时间的推移,下面的答案将变为无效。
https://github.com/tc39/proposal-decorators
装饰器的当前实现使用Microsoft制作的"反射元数据"包来提供有关编译时发现的类型的运行时信息。
这意味着,使用适当依赖注入包(即Tsyringe、TypeDI或其他(提供的装饰器的类可以使用反射提供的静态分析类型,在运行时使用装饰器将其他类实例正确地传递给启用DI的类。
这之所以有效,是因为TypeScript装饰器在编译构造函数后用函数包装构造函数。
作为类型";代币";由TypeScript编译器使用反射将实例提供到编译的代码中;容器";(其中所有实例都与令牌相关联地存储的对象(,并动态地提供给构造函数。