Vraag Hoe een instantievariabele door te geven aan de typescript-decoratorargumenten?


Hoe een typoscript-inrichting implementeren? is een goed voorbeeld over het gebruik van decorateur in typoscript.

Gezien de onderstaande zaak,

class MyClass {
    @enumerable(false)
    get prop() {
        return true;
    }

    @property({required: true}) //here pass constant is no issue
    public startDateString:string;

    @property({afterDate: this.startDateString}) //how to pass startDateString here?
    public endDateString:string;
}

function enumerable(isEnumerable: boolean) {
    return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => {
        descriptor.enumerable = isEnumerable;
        return descriptor;
    };
}

Ik heb alles geprobeerd, maar het lijkt erop dat ik niet kan passeren startDateString in decorateur argument. startDateString kan een variabele, een functie en een verwijzing zijn.


13
2018-01-13 00:20


oorsprong


antwoorden:


Wat u probeert te doen, is niet mogelijk.

Decorateurs worden gebeld wanneer de klasse wordt uitgeroepen en er is op dit moment geen enkele mogelijkheid om de decorateur binnen te gaan.

Met deze code bijvoorbeeld:

class MyClass {
    startDateString: string;
    @property({ afterDate: this.startDateString })
    endDateString: string;
}
let myClass = new MyClass();
  1. MyClass wordt verklaard.
  2. De decorateurs rennen door MyClass. Er is op dit moment geen instantie die kan worden doorgegeven this in het argument decorateur verwijst naar het globale object - niet een instantie.
  3. new MyClass() wordt aangeroepen en de instantie wordt gemaakt. Decorateurs worden bij deze stap niet aangeroepen. Dat is al gebeurd.

Bekijk de gecompileerde JavaScript als referentie:

var MyClass = (function () {
    // -- 1 --
    function MyClass() {
    }
    // -- 2 --
    __decorate([
        // see here... `this` is equal to the global object
        property({ afterDate: this.startDateString })
    ], MyClass.prototype, "endDateString", void 0);
    return MyClass;
})();
// -- 3 --
var myClass = new MyClass();

Merk op dat gebruik this.startDateString werpt hier geen compileerfout omdat this is getypt als any.

Dus wat hier probeert te worden gedaan door een instantie van een instantie door te geven, heeft geen zin en is niet mogelijk.

Wat je zou kunnen doen is maken startDateString statisch, geef het dan als volgt door: @property({ afterDate: MyClass.startDateString }).


7
2018-01-13 00:38



U hebt geen toegang tot een objecteigenschap uit een attribuutdefinitie.

Decorator wordt aangeroepen wanneer de eigenschap is gedefinieerd.

U kunt de getter of setter gebruiken om controle te krijgen wanneer u toegang tot de woning krijgt.


3
2018-01-13 00:42