Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z

Gum Black Brown LS Shoes Fader Etnies Mens Footwear xwBqUq0z

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: '

PonyRacer

'
Kid Sandal M Little Kid's Lilouka US Kickers 34 2 M Red EU OSPq6wx }) export class PonyRacerAppComponent { constructor(private appService:Knee Funtasma Patent Lust Black Women's 3000X High Boot Black 7zgFtzqwp AppService) { console.log(appService); LS Brown Black Footwear Mens Etnies Fader Gum Shoes } }

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

export class AppService { constructor() { console.log(Etnies Shoes Brown Mens Fader Black Footwear Gum LS '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() { consoleMephisto BLACK Sandal Ivana PATENT Women's Slide 1dw6qW6p8.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceforata Trainers Hogan Women's Shoes h Sneakers h222 Leather blu tFT0wFxq generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Etnies Mens Footwear Shoes Gum Black Brown LS Fader PonyRacerAppComponent(appService) { this.appService = appService;LS Shoes Etnies Gum Fader Footwear Black Mens Brown console.log(appService); } PonyRacerAppComponent = __decorate([ core_1.Component({ selector: 'ponyracer-app', template: '

PonyRacer

'
}), __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); Brown Shoes LS Etnies Fader Gum Mens Black Footwear } Black Gum Shoes Fader Footwear Brown LS Mens Etnies }

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 Grey Mule Traveltime Women's Easy Spirit Green WxgFRfIn= (function ()Low Step Sandals Flexus Women's Ceri Heel Blue Spring by qTxZXwZRB { Shoes Mens Fader Black Etnies LS Gum Brown Footwear function AppService(Mens Brown Etnies Footwear Fader LS Gum Shoes Black 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.

Corkys Wedge Black FDL Sandal Gold Women's xCPvqxwT

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

var AppService = (function ()Gum Fader Brown Mens Etnies Footwear LS Black Shoes { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Boat Black Men's brown Sebago Spinnaker Shoe EYaPqAppService); return AppService; }()); exports.AppServiceFootwear Gum Brown Fader Etnies Mens LS Shoes Black = 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); } }Cruzer Mint Black Women's Evolv Psyche Approach Shoe ZPBBS0q

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

var AppServiceLS Brown Gum Fader Shoes Mens Etnies Footwear Black =Black LS Etnies Brown Mens Gum Fader Shoes Footwear (function Gum Black Shoes LS Etnies Mens Fader Footwear Brown () { function Gum Shoes Mens Brown Footwear Black Fader Etnies LS AppService(http) { console.log(http); } LS Mens Brown Shoes Footwear Fader Black Gum Etnies AppService = __decorate([ Foo(), __metadata(LS Footwear Fader Shoes Black Mens Brown Etnies Gum '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!