Wie anpassen Eigenschaften in Typoskript

stimmen
10

Wie erhalte ich Typoskript Eigenschaftsdefinitionen zu emittieren, wie:

Object.defineProperties(this, {
    view: {
        value: view,
        enumerable: false,
        writable: false,
        configurable: false
    },
});
Veröffentlicht am 02/10/2012 um 19:40
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
9

Sie können verwendet werden getund setin Maschinenschrift, die kompilieren in Object.defineProperties.

Dies ist eine ECMAScript 5 - Funktion, so dass Sie es nicht verwenden , wenn Sie ES3 sind Targeting (die Standardeinstellung für den Compiler). Wenn Sie glücklich sind ES5 Ziel, fügen Sie --target ES5zu Ihren Diensten .

Typoskript:

class MyClass {
    private view;
    get View() { return this.view; }
    set View(value) { this.view = value }
}

Compiliert zu:

var MyClass = (function () {
    function MyClass() { }
    Object.defineProperty(MyClass.prototype, "View", {
        get: function () {
            return this.view;
        },
        set: function (value) {
            this.view = value;
        },
        enumerable: true,
        configurable: true
    });
    return MyClass;
})();

Aber wenn Sie die volle Kontrolle wollen zählbare und konfigurierbar neu eingestellt werden - man könnte noch den rohen verwendet Object.definePropertiesCode.

Beantwortet am 04/10/2012 um 22:42
quelle vom benutzer

stimmen
4

Ich war auf der Suche nach genau der gleichen Sache , wenn ich gestolpert Typoskript Handbuch: Dekorateure . In „Method Zierer“ Absatz definieren sie @enumerableDekorateur Fabrik, die wie folgt (von dort bin ich einfach kopieren-Einfügen) aussieht:

function enumerable(value: boolean) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        descriptor.enumerable = value;
    };
}

und sie nutzen es wie folgt aus:

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }

    @enumerable(false)
    greet() {
        return "Hello, " + this.greeting;
    }
}

So ein anderer Weg, um es anzugehen, ist durch Verwendung von Dekorateure.

PS: Diese Funktion erfordert experimentalDecoratorsFlagge übergeben werden tscoder eingestellt tsconfig.json.

Beantwortet am 27/02/2017 um 16:39
quelle vom benutzer

stimmen
1

Dies wird derzeit nicht unterstützt , wenn Sie wollen , dass alle Eigenschaften wie die emittiert werden. Ich würde empfehlen , ein Problem bei der Einreichung CodePlex - Website mit Informationen über das, was Ihren Anwendungsfall und Anforderungen sind.

Wenn Sie mit --target ES5 tun kompilieren, können Sie so etwas wie dieses:

class n {
    get foo() { return 3; }
    bar() { return 5; }
}

Welche produziert diesen Code:

var n = (function () {
    function n() { }
    Object.defineProperty(n.prototype, "foo", {
        get: function () {
            return 3;
        },
        enumerable: true,
        configurable: true
    });
    n.prototype.bar = function () {
        return 5;
    };
    return n;
})();
Beantwortet am 02/10/2012 um 19:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more