发射装饰器元数据及其在转译代码中的重要性

Mis*_*r_L 9 decorator typescript angular

我很好奇该emitDecoratorMetadata选项在将 TypeScript 转换为 JavaScript(在 Angular 2 上下文中)的重要性。如果设置为false,并且元数据将不会包含在生成的代码中,它会产生什么影响?

Fen*_*ton 6

如果您想在运行时反映元数据,则需要装饰器元数据。

如果您不这样做,例如使用Reflect.metadata,则排除输出没有影响。默认情况下,emitDecoratorMetadatafalse。装饰器仍然有效,但设计时信息在运行时不可用。


Pan*_*ava 5

这是我在阅读中遇到的一个场景......

注入器使用 TypeScript 编译器输出的元数据来确定组件正在请求哪些服务类型。元数据输出有关在方法上声明的参数的数量和类型的信息。

然后依赖注入系统可以查看构造函数参数元数据来确定要注入的类型。

所有这些都是由名为的特殊 TypeScript 编译器选项启用的

"emitDecoratorMetadata":true
Run Code Online (Sandbox Code Playgroud)

通常在tsconfig.json文件中配置。

如果emitDecoratorMetadata未设置为true,Angular 无法找出要在您的应用程序中注入的内容。

如果您使用 Angular CLI 创建应用程序。true默认情况下,此选项处于打开状态(设置为)。

如果类上有装饰器,则只会为服务或组件发出元数据。哪个装饰器并不重要。任何装饰器都会导致元数据被发出。这就是为什么我们将 Injectable() 装饰器添加到服务中并且我们不必将它添加到组件中,因为它们已经有了组件装饰器

因此,注入系统确定要注入到组件构造函数中的类型。

  • 从 Angular 8+ 开始,“emitDecoratorMetadata”:true 会导致“无法在初始化之前访问”问题,至少在我的使用场景中,当不使用 AOT 进行开发构建时。请参阅:https://github.com/angular/angular-cli/issues/15077 (5认同)