Come personalizzare le proprietà a macchina

voti
10

Come faccio ad avere dattiloscritto di emettere le definizioni delle proprietà quali:

Object.defineProperties(this, {
    view: {
        value: view,
        enumerable: false,
        writable: false,
        configurable: false
    },
});
È pubblicato 02/10/2012 alle 19:40
fonte dall'utente
In altre lingue...                            


3 risposte

voti
9

È possibile utilizzare gete seta macchina, che compila in Object.defineProperties.

Questa è una caratteristica ECMAScript 5, quindi non si può usare se si prendono di mira ES3 (il valore predefinito per il compilatore). Se si è soddisfatti di indirizzare ES5, aggiungere --target ES5al vostro comando.

Dattiloscritto:

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

Compila a:

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

Ma se si vuole il pieno controllo di impostazione enumerabile e configurabile - si potrebbe ancora utilizzare il grezzo Object.definePropertiescodice.

Risposto il 04/10/2012 a 22:42
fonte dall'utente

voti
4

Ero alla ricerca di esattamente la stessa cosa quando sono incappato in dattiloscritto Handbook: Decoratori . In "Metodo Decoratori" comma definiscono @enumerablefabbrica decoratore, che assomiglia a questo (io sono semplicemente copiare-incollare da lì):

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

e lo usano in questo modo:

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

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

Quindi, un altro modo di affrontare esso, è attraverso l'utilizzo di decoratori.

PS: Questa funzione richiede experimentalDecoratorsbandiera per essere passato a tsco impostare in tsconfig.json.

Risposto il 27/02/2017 a 16:39
fonte dall'utente

voti
1

Questo non è attualmente supportato se si desidera che tutte le proprietà di essere emessi in quel modo. Mi consiglia di deposito di una questione al sito CodePlex con i dettagli su ciò che il vostro caso e requisiti di uso sono.

Se lo fai compilare con --target ES5, si può avere qualcosa di simile a questo:

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

Che produce questo codice:

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;
})();
Risposto il 02/10/2012 a 19:43
fonte dall'utente

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