Jak dostosować właściwości na maszynie

głosy
10

Jak mogę dostać maszynopis emitować definicji właściwości, takie jak:

Object.defineProperties(this, {
    view: {
        value: view,
        enumerable: false,
        writable: false,
        configurable: false
    },
});
Utwórz 02/10/2012 o 19:40
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
9

Można użyć geti setna maszynie, która w kompilacji Object.defineProperties.

Jest to cecha ECMAScript 5, więc nie można go używać, jeśli są kierowane ES3 (domyślny dla kompilatora). Jeśli jesteś zadowolony kierować ES5, dodać --target ES5do swojej dyspozycji.

Maszynopis:

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

Kompiluje się do:

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;
})();

Ale jeśli chcesz pełną kontrolę ustawiania przeliczalny i konfigurowalny - można nadal używać surowego Object.definePropertieskodu.

Odpowiedział 04/10/2012 o 22:42
źródło użytkownik

głosy
4

Szukałem dokładnie to samo, gdy natknąłem się maszynopis Handbook: Dekoratorzy . W „Metoda” dekoratorów ust definiują one @enumerablefabrykę dekorator, który wygląda tak (jestem po prostu kopia wklejanie stamtąd):

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

i używać go tak:

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

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

Więc inny sposób adresowania go, jest dzięki użyciu dekoratorów.

PS: Ta funkcja wymaga experimentalDecoratorsflagi mają być przekazane do tsclub ustawić w tsconfig.json.

Odpowiedział 27/02/2017 o 16:39
źródło użytkownik

głosy
1

To nie jest obecnie obsługiwana, jeśli chcesz wszystkie właściwości mają być emitowane tak. Polecam zgłoszenia problemu w witrynie CodePlex ze szczegółami o tym, co sprawa, a wymagania są stosowane.

Jeśli nie skompilować z --target ES5, można mieć coś takiego:

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

Która produkuje ten kod:

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;
})();
Odpowiedział 02/10/2012 o 19:43
źródło użytkownik

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