2012-10-02 17 views

risposta

4

Stavo cercando esattamente la stessa cosa quando sono incappato su TypeScript Handbook: Decorators. In "Metodo Decoratori" comma definiscono @enumerable fabbrica decoratore, che assomiglia a questo (sto semplicemente copia-incolla 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; 
    } 
} 
Così

un altro modo di affrontarlo, è attraverso l'uso di decoratori.

PS: Questa caratteristica richiede experimentalDecorators bandiera da passare tsc o impostare in tsconfig.json.

1

Questo non è attualmente supportato se si desidera che tutte le proprietà di essere emessi in quel modo. Ti consigliamo di presentare un problema al numero CodePlex site con i dettagli su quali sono i tuoi casi d'uso e i tuoi requisiti.

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

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

sì, sto cercando un modo per personalizzare gli attributi "enumerable", "configurable" e "writable" per abbinare il mio codice esistente. – Spongman

9

È possibile utilizzare get e set a macchina, che compilare in Object.defineProperties.

Questa è una funzione ECMAScript 5, quindi non è possibile utilizzarla se si sta puntando su ES3 (il valore predefinito per il compilatore). Se sei felice di scegliere come target ES5, aggiungi --target ES5 al tuo 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 codice grezzo Object.defineProperties.