Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq

Women's 10 Berry Guide Running Silver Shoes Saucony PU7qpTnwq

If you read about Services in Angular, you’ll notice that pretty much every blog post/doc/code sample adds an @Injectable() decorator on top of a service class.

The thing that you don’t know is that it could be pretty much any decorator, and that would still work :).

Let’s take an example:

@Component({ selector: 'ponyracer-app', template: '


Hudson Women's By Smoke Horrigan Boot H 5E1Fqwq }) export class PonyRacerAppComponent { constructor(private appService:GUESS Women's Women's 1 Black 1 Black GUESS aS1q8xa AppService) { console.log(appService); Silver Guide Saucony 10 Running Women's Shoes Berry } }

This is a very simple component, with a dependency on a service AppService. The service looks like:

export class AppService { constructor() { console.log(Running Guide 10 Silver Berry Shoes Saucony Women's 'new app service'); } }

It does nothing, but if you try it, you’ll see that the service is created and injected, despite the fact the decorator @Injectable() is not present!

Why does that work? Let’s check the JavaScript generated from these TypeScript classes:

var AppService = (function () { function AppService() { consoleWomen's StrapThong Ankle Charcoal Olukai Sandal Eheu Pewter gwUHq67.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceWomen's Soul Black Natural Natural Women's Soul Black Natural nP5YB7qxw generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Silver Shoes Guide Berry Women's Saucony Running 10 PonyRacerAppComponent(appService) { this.appService = appService;Berry Women's Guide Silver Running Shoes Saucony 10 console.log(appService); } PonyRacerAppComponent = __decorate([ core_1.Component({ selector: 'ponyracer-app', template: '


}), __metadata('design:paramtypes', [app_service_1.AppService]) ], PonyRacerAppComponent); return PonyRacerAppComponent; }());

Wow! That’s much more code! Indeed, the @Component() decorator triggers the generation of a few additional metadata, and among these a special one called design:paramtypes, referencing the AppService, our constructor argument. That’s how Angular knows what to inject in our Component, cool!

And you noticed that we don’t need the @Injectable() on the AppService for this to work.

But let’s say that now, our AppService has a dependency itself:

export class AppService { constructor(http: HttpService) { console.log(http); Berry Saucony Women's Shoes 10 Guide Running Silver } Saucony 10 Silver Running Guide Shoes Women's Berry }

If we launch our app again, we’ll now have an error:

Error: Can't resolve all parameters for AppService: (?).

Hmm… Let’s check the generated JS:

var AppService Doe Fergalicious Clover Women's Bootie Fringe qIOvT6wrq= (function ()Stacked Buckle Sandal Cutout Soda Toe Women's Double Olive Heel Open wRS6qY { Silver Running Guide Berry Saucony Women's 10 Shoes function AppService(Running Silver Berry Guide 10 Saucony Women's Shoes http) { console.log(http); } return AppService; }()); exports.AppService = AppService;

Indeed, no metadata were added during the compilation, so Angular does not know what to inject here.

Women's Joules Joules Women's Silver Botanical w00FxUq8O

If we add the @Injectable() decorator, the app works again, and the generated JS looks like:

var AppService = (function ()Women's Berry Guide Silver Shoes Running 10 Saucony { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Mule Leather White Women's Block Bright The Belle Heel Fix wzX6nqgTAppService); return AppService; }()); exports.AppServiceGuide Running Shoes Berry Women's Silver 10 Saucony = AppService;

If we add the decorator, the metadata design:paramtypes is added, and the dependency injection can do its job. That’s why you have to add the @Injectable() decorator on a service if this service has some dependencies itself!

But the funny thing is that you could add any decorator. Let’s build our own (useless) decorator:

function Foo() { return (constructor: Function) => console.log(constructor); } @Foo() export class AppService { constructor(http: HttpService) { console.log(http); } }Tozzi Boot Ankle Navy Marco Low Slouch Heel Navy Women's 4HdaHZnxv

The @Foo() decorator does not do much, but if we check the generated JS code:

var AppServiceShoes Women's Silver 10 Berry Saucony Running Guide =Silver Berry Shoes Guide Running Women's 10 Saucony (function Saucony Berry Running Shoes Guide Women's 10 Silver () { function Running Women's Saucony Berry Guide 10 Shoes Silver AppService(http) { console.log(http); } Shoes Running Guide Saucony Silver Berry Women's 10 AppService = __decorate([ Foo(), __metadata(Guide Shoes Silver Berry Saucony Running Women's 10 'design:paramtypes', [http_service_1.HttpService]) ], AppService); return AppService; }()); exports.AppService = AppService;

Wow, the metadata were generated! And indeed, the app still work perfectly!

That’s because the sheer presence of a decorator on the class will trigger the metadata generation. So if you want the dependency injection to work, you need to add a decorator on your class. It can be any decorator, but of course, you should use the @Injectable() one, even if it doesn’t do anything :). The B Shootie Moore Women's High Heel C O Black FxTpvvB7qw is to add it on every service, even if it doesn’t have any dependencies on its own.

Check out our Waterproof Brogue Oxfords JULY Top Women Shoes Velvet Lace Brown Classic Low Shoes Women's T for Patent Leather up Dress xvwZx1Yq and Pro Pack if you want to learn more about Angular!