TypeScript装饰器在单独的文件中定义

时间:2016-03-18 10:29:37

标签: typescript angular

(问题是关于Typescript和Angular2,我保证;])

我在Symfony2中做了很多使用注释的代码。 在Symfony和Doctrine中,注释是可选的,您可以使用yaml,xml或plain PHP配置实体映射,路由和任何其他内容。

这对于准备要用作单独库的代码很有用。我可以准备我的代码免费symfony,然后我可以创建一个将它与symfony集成的包。如果我不打算在symfony之外使用该代码,我仍然可以使用注释。

然后我开始学习Angular2和TypeScript。有装饰师做任何事情。用于组件元数据,服务,一切的装饰器。

因此,如果我想创建一个可以与我的应用程序一起使用的服务,我必须将其标记为可注射。如果我想准备一个可以用于任何框架的课程,该怎么办?

是否可以单独添加装饰器(以某种理智的方式),这样我就可以向Angular2的DI注入一个外部类。

2 个答案:

答案 0 :(得分:1)

事实上,如果你想在课堂上注入一些内容,你需要使用@Injectable装饰器。这意味着你需要使用一些Angular2,因为你想使用它的依赖注入; - )

如果你不想在其中注入一些内容,你可以在不使用这个装饰器的情况下将类注入其他内容......

有关详细信息,请参阅此问题:

答案 1 :(得分:1)

如果您希望能够注入一个本身具有依赖关系(构造函数参数)但不想要或不能应用@Injectable()的类,那么您可以使用工厂

bootstrap(AppComponent, [
    SomeDep, 
    provide(SomeType, {useFactory: (dep) => new SomeType(dep), 
        deps: [SomeDep]})
]);

您可以为此类提供程序创建变量,以便在没有此繁琐声明的情况下轻松重用这些变量(例如HTTP_PROVIDERS

export const SOME_TYPE_PROVIDERS: any[] = [
  SomeDep, 
  provide(SomeType, {useFactory: (dep) => new SomeType(dep), 
      deps: [SomeDep]})
];

然后像

一样使用它
bootstrap(AppComponent, [SOME_TYPE_PROVIDERS]);