2016-09-01 1 views
0

In meiner Bibliothek (für AngularJS) Ich versuche, folgende Funktionen zu implementieren:Wie definieren Klasseneigenschaften in Babel deaktivieren + transformations Dekorateure-legacy

  1. Sie können eine leere Klasse Eigenschaft mit einigen Dekorateur markieren
  2. Während der Initialisierung wird diese Eigenschaft durch Getter ersetzt, der durch Object.defineProperty definiert ist.
  3. Der Benutzer kann diese Eigenschaft innerhalb der Klasse aufrufen, und der Getter wird aufgerufen.

Aber ich habe ein unerwartetes Verhalten in Babel getroffen. In Typescript, das in der Bibliothek verwendet wird, funktioniert es gut, aber Babel erstellt eine Menge Code, der bereits definierte Eigenschaften für seine Initialisierer neu definiert.

Es ist die verzierte Klasse in ES2015:

@Component({ 
    selector: 'test' 
}) 
export class TestClass { 
    @Inject('$http') $http; 
    @Inject('$q') $q; 
} 

Es ist der resultierende Code:

var TestClass = exports.TestClass = (_dec9 = (0, _ngMetasys.Component)({ 
    selector: 'test' 
}), _dec10 = (0, _ngMetasys.Inject)('$http'), _dec11 = (0, _ngMetasys.Inject)('$q'), _dec9(_class4 = (_class5 = function TestClass() { 
    (0, _classCallCheck3.default)(this, TestClass); 
    // everything is OK, TestClass.prototype.$http is a getter with function() => $http. 

    _initDefineProp(this, '$http', _descriptor5, this); // there are dragons. Property $http is redefined to undefined. 

    _initDefineProp(this, '$q', _descriptor6, this); 
}, (_descriptor5 = _applyDecoratedDescriptor(_class5.prototype, '$http', [_dec10], { 
    enumerable: true, 
    initializer: null 
}), _descriptor6 = _applyDecoratedDescriptor(_class5.prototype, '$q', [_dec11], { 
    enumerable: true, 
    initializer: null 
})), _class5)) || _class4); 

Wie kann ich diese Eigenschaft Neudefinition deaktivieren? Gibt es eine Möglichkeit, die Neudefinition von babels Eigentum zu vermeiden oder es zu ersetzen?

Antwort

0

Ich glaube, ich habe eine Antwort auf meine Frage gefunden. Es gibt einen Test in babel-plugin-transform-decorators-legacy, der es erlaubt, den Deskriptor der Eigenschaft einzurichten, sogar einfache Eigenschaft in einen Getter umzuwandeln.

Es gibt eine Einschränkung. Wenn Sie sich daran erinnern wollen, dass der Dekorateur es später ändert, wird es nicht funktionieren. Ich habe es nicht richtig untersucht, aber ich denke, mein Problem war die Tatsache, dass ich den Deskriptor nach der Initialisierung der Klasse (und der Eigenschaften) ändere, und Änderungen, die ich an den Deskriptor mache, wirken sich nicht auf bereits initialisierte Eigenschaften aus.

Also gibt es den Test, der mir den Hinweis gab. Es ist von here.

it('should support mutating an initialzer into an accessor', function(){ 
    function dec(target, name, descriptor){ 
    expect(target).to.be.ok; 
    expect(name).to.eql("prop"); 
    expect(descriptor).to.be.an('object'); 

    let {initializer} = descriptor; 
    delete descriptor.initializer; 
    delete descriptor.writable; 

    let value; 
    descriptor.get = function(){ 
     if (initializer){ 
     value = '__' + initializer.call(this) + '__'; 
     initializer = null; 
     } 
     return value; 
    }; 
    } 

    class Example { 
    @dec 
    prop = 3; 
    } 

    let inst = new Example(); 

    expect(inst.prop).to.eql('__3__'); 
}); 
Verwandte Themen