2012-10-02 22 views

Odpowiedz

4

Szukałem dokładnie tego samego, gdy natknąłem się na TypeScript Handbook: Decorators. W „Metoda” dekoratorów ust definiują one @enumerable fabrykę dekorator, który wygląda tak (ja po prostu kopia wklejanie stamtąd):

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

i używają go tak:

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

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

Tak innym sposobem rozwiązania tego problemu jest użycie dekoratorów.

PS: Ta funkcja wymaga experimentalDecorators flagi mają być przekazane do tsc lub ustawić w tsconfig.json.

1

To nie jest obecnie obsługiwana, jeśli chcesz wszystkie właściwości mają być emitowane tak. Zalecam zgłoszenie problemu pod numerem CodePlex site ze szczegółowymi informacjami o tym, jaki jest twój przypadek użycia i wymagania.

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

Tak, szukam sposobu na dostosowanie atrybutów "przeliczalnych", "konfigurowalnych" i "zapisywalnych", aby pasowały do ​​mojego istniejącego kodu. – Spongman

9

Można użyć get i set w maszynopis, który skompilować w Object.defineProperties.

To jest funkcja ECMAScript 5, więc nie można jej używać, jeśli kierujesz na ES3 (domyślny dla kompilatora). Jeśli chcesz kierować reklamy na ES5, dodaj do swojego polecenia --target ES5.

maszynopis:

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

gromadzi 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 kodu Object.defineProperties.