我可以扩展Angular @Injectable装饰器吗?

时间:2019-12-05 21:41:54

标签: angular

我想在初始化时向根目录中提供的所有服务添加自定义行为。我已经有一个装饰器了,但是我希望当类与@Injectable装饰器一起使用时,它总是被应用。

这可能吗?我尚未找到任何相关信息,当然也不想编辑节点模块。

PD:我正在使用Angular 8

1 个答案:

答案 0 :(得分:1)

从技术上讲这是可能的,但我不推荐。

1。)装饰器在TypeScript中是实验性的,您必须在tsconfig.json中使用道具"experimentalDecorators": true

对其进行配置。

摘自官方TypeScript documentation

  

注意装饰器是一项实验功能,在将来的版本中可能会发生变化。

2。)这就是为什么Angular团队在编译时使用所谓的TypeScript变形器来删除它们的原因,并且如果装饰器从不脱离“实验”状态或更糟的情况下被删除,则是安全的。使用TypeScript变形金刚,可以在编译时更改书面源的AST(抽象语法树)。 Here是这些内置变压器的很好概述。

当然,您可以构建“自定义” TypeScript转换器,但我不建议您这样做,因为它涉及很多试验和错误。但是那里有博客文章。我不会链接它们;)

3。)一次Maxim did write a custom @Component装饰器,但我认为它不能满足您的需求。

摘要

所以我提议的所有解决方案都是:

  • 将该逻辑拉入独立服务并将其注入给定服务
  • 如果要共享方法,请使用类继承和/或抽象类。
  • ...尽管如此,我还是宁愿继承而不是继承
  • 如果需要的话,在其服务构造函数中初始化这些服务(在构造函数中包含逻辑的坏习惯,尽管如果解决问题我会随时这样做)
  • 将服务注入NgModule的构造函数中,并对其进行初始化

...如果不可能所有这些方法,我将开始考虑自定义装饰器。将额外的魔术隐藏在给定的装饰器后面是不可取的,因为没人会在那里期望它,并且这会带来麻烦。但那只是我的个人意见。如上所指出:除非编写转换器,否则即使自定义装饰器也将基于实验功能构建。因此,如果我选择避免它们,我会坚持下去的。