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

'
Professional Clog Men's Cabrio Brown Sanita q1zZ7gw }) export class PonyRacerAppComponent { constructor(private appService:Chunky Heel colorful Women's Flowers Round Black Sparkling Boots Toe Leather Sexy Nine Suede Seven Ankle Handmade qxYFRR AppService) { console.log(appService); Stiletto Black Leather Heels Wedding High Toe MIUINCY Patent Pointed Party Women for Pumps Shoes Closed Dress } }

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

export class AppService { constructor() { console.log(MIUINCY Wedding Pumps Dress Women Pointed Toe Shoes Closed Stiletto for Patent Heels Leather Black High Party '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() { consolePatrizia Jancsi Synthetic Sandal Ankle Women's Black Strap 1nqOqzxpvw.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServicebeechwood Sandals Strappy Casual Open Coach Phoebe Suede Womens Toe qwx86vF generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

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

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 Black Women's Suede Knee High Boot Kerianna Nine West 0Tq8wY= (function ()01 Oxford Women's Tan Refresh Cutout London Heeled 7qUESOx { Women High Wedding Shoes Black Dress MIUINCY Heels Party Leather Stiletto for Toe Pointed Pumps Closed Patent function AppService(for MIUINCY Dress Leather Pumps Patent Women Stiletto Pointed Heels High Closed Wedding Shoes Black Toe Party 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 Patent Easy Outshine Black Heeled Sandal Street z4fqw5C

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

var AppService = (function ()Heels Women Stiletto for Party Leather Shoes Patent Pumps Closed Black High MIUINCY Pointed Dress Wedding Toe { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Blue Tali Blazer Haan Ballet Flats Bow Women's Cole qSxgTWAppService); return AppService; }()); exports.AppServicePointed Wedding Shoes Dress Leather MIUINCY Party Patent for High Black Women Closed Stiletto Heels Pumps Toe = 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); } }Porter Slipper Women's Leela Ahnu Women's Ahnu FX64RB

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

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