Skip to content

Instantly share code, notes, and snippets.

@shuhei
Last active November 25, 2015 07:43
Show Gist options
  • Save shuhei/e94935cb576fbe5b687e to your computer and use it in GitHub Desktop.
Save shuhei/e94935cb576fbe5b687e to your computer and use it in GitHub Desktop.
Angular 2's property decorators don't work with Babel 5.x.

The _defineDecoratorPropertyDescriptor calls that Babel 5.x generates mess up @Input decorators somehow.

function Linker() {
  _classCallCheck(this, _Linker);

  _defineDecoratedPropertyDescriptor(this, 'name', _instanceInitializers);

  _defineDecoratedPropertyDescriptor(this, 'url', _instanceInitializers);
}

The Object.defineProperty(target, key, descriptor) does something...

function _defineDecoratedPropertyDescriptor(target, key, descriptors) {
  var _descriptor = descriptors[key];
  if (!_descriptor) return;
  var descriptor = {};
  for (var _key in _descriptor) descriptor[_key] = _descriptor[_key];
  descriptor.value = descriptor.initializer ? descriptor.initializer.call(target) : undefined;
  Object.defineProperty(target, key, descriptor); // This!
}

It seems like the defineProperty overrides the properties passed by the parent or avoids them updated.

Q. What's gonna happen on property initializers in TypeScript?

var _createDecoratedClass = (function () {
function defineProperties(target, descriptors, initializers) {
for (var i = 0; i < descriptors.length; i++) {
var descriptor = descriptors[i];
var decorators = descriptor.decorators;
var key = descriptor.key;
delete descriptor.key;
delete descriptor.decorators;
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor || descriptor.initializer) descriptor.writable = true;
if (decorators) {
for (var f = 0; f < decorators.length; f++) {
var decorator = decorators[f];
if (typeof decorator === 'function') {
descriptor = decorator(target, key, descriptor) || descriptor;
} else {
throw new TypeError('The decorator for method ' + descriptor.key + ' is of the invalid type ' + typeof decorator);
}
}
if (descriptor.initializer !== undefined) {
initializers[key] = descriptor;
continue;
}
}
Object.defineProperty(target, key, descriptor);
}
}
return function (Constructor, protoProps, staticProps, protoInitializers, staticInitializers) {
if (protoProps) defineProperties(Constructor.prototype, protoProps, protoInitializers);
if (staticProps) defineProperties(Constructor, staticProps, staticInitializers);
return Constructor;
};
})();
function _defineDecoratedPropertyDescriptor(target, key, descriptors) {
var _descriptor = descriptors[key];
if (!_descriptor) return;
var descriptor = {};
for (var _key in _descriptor) descriptor[_key] = _descriptor[_key];
descriptor.value = descriptor.initializer ? descriptor.initializer.call(target) : undefined;
Object.defineProperty(target, key, descriptor);
}
var Linker = (function () {
var _instanceInitializers = {};
_createDecoratedClass(Linker, [{
key: 'name',
decorators: [(0, _angular2Angular2.Input)()],
initializer: null,
enumerable: true
}, {
key: 'url',
decorators: [(0, _angular2Angular2.Input)()],
initializer: null,
enumerable: true
}], null, _instanceInitializers);
function Linker() {
_classCallCheck(this, _Linker);
_defineDecoratedPropertyDescriptor(this, 'name', _instanceInitializers);
_defineDecoratedPropertyDescriptor(this, 'url', _instanceInitializers);
}
var _Linker = Linker;
Linker = (0, _angular2Angular2.View)({
template: '<p><a [href]="url" [title]="name">{{ name }}</a></p>'
})(Linker) || Linker;
Linker = (0, _angular2Angular2.Component)({
selector: 'linker'
// inputs: ['name', 'url']
})(Linker) || Linker;
return Linker;
})();
var __decorate = (this && this.__decorate) || function(decorators, target, key, desc) {
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
return Reflect.decorate(decorators, target, key, desc);
switch (arguments.length) {
case 2:
return decorators.reduceRight(function(o, d) {
return (d && d(o)) || o;
}
, target);
case 3:
return decorators.reduceRight(function(o, d) {
return (d && d(target, key)),
void 0;
}
, void 0);
case 4:
return decorators.reduceRight(function(o, d) {
return (d && d(target, key, o)) || o;
}
, desc);
}
};
var __metadata = (this && this.__metadata) || function(k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(k, v);
};
Linker = (function() {
function Linker() {
}
__decorate([
angular2_1.Input(),
__metadata('design:type', String)
], Linker.prototype, "name");
__decorate([
angular2_1.Input(),
__metadata('design:type', String)
], Linker.prototype, "url");
Linker = __decorate([
angular2_1.Component({
selector: 'linker'
}),
angular2_1.View({
template: '<p><a [href]="url" [title]="name">{{ name }}</a></p>'
}),
__metadata('design:paramtypes', [])
], Linker);
return Linker;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment