Jak mogę dostać maszynopis emitować definicji właściwości, takie jak:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Jak mogę dostać maszynopis emitować definicji właściwości, takie jak:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
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.
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.
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;
})();