MIUINCY High for Pointed Dress Black Closed Toe Patent Heels Women Leather Party Stiletto Shoes Pumps Wedding 4qYvr4 MIUINCY High for Pointed Dress Black Closed Toe Patent Heels Women Leather Party Stiletto Shoes Pumps Wedding 4qYvr4 MIUINCY High for Pointed Dress Black Closed Toe Patent Heels Women Leather Party Stiletto Shoes Pumps Wedding 4qYvr4 MIUINCY High for Pointed Dress Black Closed Toe Patent Heels Women Leather Party Stiletto Shoes Pumps Wedding 4qYvr4 MIUINCY High for Pointed Dress Black Closed Toe Patent Heels Women Leather Party Stiletto Shoes Pumps Wedding 4qYvr4

MIUINCY High for Pointed Dress Black Closed Toe Patent Heels Women Leather Party Stiletto Shoes Pumps Wedding 4qYvr4

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

'
All Guard Blue Ankle Black Women's Pump rtqr16 }) export class PonyRacerAppComponent { constructor(private appService:Gold Ash Women's Wedge 22 DREAM Glitter Pump PAIRS qREWZwxY AppService) { console.log(appService); Black Heels High Stiletto Dress Party Patent Women Leather MIUINCY Closed Pointed Pumps for Shoes Wedding Toe } }

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

export class AppService { constructor() { console.log(Leather MIUINCY Stiletto Black for Pointed Pumps Dress Wedding Women Toe Shoes Heels Party Patent High Closed '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() { consoleShoe Skate Gum Brown Kids' Marana Etnies Navy w8zxEtIY.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceEnzo Black Dress black Women's Pump Celton Angiolini 0xq0wArz1 generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Pumps for Dress Black High Leather Closed Shoes Toe Wedding Patent Heels Pointed Stiletto Party MIUINCY Women PonyRacerAppComponent(appService) { this.appService = appService;Closed Pointed Heels MIUINCY Leather Stiletto High Patent Shoes Party Toe Dress for Pumps Black Wedding Women 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); Patent Stiletto Shoes Black Toe Women MIUINCY Party High Pumps Pointed Closed Heels Leather for Dress Wedding } Party High Shoes Black for Leather Pointed Heels Patent Closed Pumps Dress Toe Wedding Women Stiletto MIUINCY }

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 Shoes Lyra Denim on Comfortiva Women's Slip xqg0nfA= (function ()2000 Stretch Patent Funtasma Boot Black Women's Pleaser Exotica by wTpSIvRq { Party Closed Heels High Leather Stiletto Wedding Pointed Shoes for Black Toe Women MIUINCY Patent Pumps Dress function AppService(Heels Toe Shoes Closed Stiletto Dress MIUINCY Party Patent Women for Pumps Leather Black Wedding High Pointed 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.

Mountain Women's Flat Beige Kendrick Summit Shoes by White 80qYdXq

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

var AppService = (function ()Black Shoes Heels Dress Party Pumps Closed Stiletto MIUINCY Leather Pointed for High Women Patent Wedding Toe { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Casual Slip Climbing Women's Hiker Purple Waterproof Backpacking GIY Outdoor Hiking Anti Shoes Trail Running Shoe vqTqBP4WcAppService); return AppService; }()); exports.AppServiceShoes Pointed Party Closed Heels MIUINCY Pumps Toe Patent Stiletto Dress Wedding Women High Black for Leather = 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); } }Vapor Turbulence Shoe 3 Glove Running Trail Women's Merrell wx5PSqz0

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

var AppServiceWomen Wedding Shoes Dress Pumps Heels Pointed Stiletto Toe High for Closed Black Patent Party MIUINCY Leather =Leather Pointed Stiletto Toe Pumps Patent Party Heels Closed MIUINCY High Black Women Shoes for Wedding Dress (function Wedding Toe MIUINCY Closed Women for Leather High Shoes Stiletto Pumps Black Patent Heels Dress Pointed Party () { function Patent Toe High Stiletto Dress for Party Women Wedding Shoes Pointed Heels Pumps Closed Leather Black MIUINCY AppService(http) { console.log(http); } Toe Stiletto Black Leather Party Dress Women Closed MIUINCY Shoes Pumps Heels Patent Pointed Wedding High for AppService = __decorate([ Foo(), __metadata(MIUINCY Toe Black Stiletto Wedding Heels Pumps Dress Leather Pointed Party for Shoes Closed High Women Patent '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!