Comment puis-je obtenir tapuscrit d'émettre des définitions de propriétés telles que:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Comment puis-je obtenir tapuscrit d'émettre des définitions de propriétés telles que:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Vous pouvez utiliser getet setdactylographiée, qui compile en Object.defineProperties.
Ceci est une ECMAScript 5 fonction, donc vous ne pouvez pas l' utiliser si vous ciblez ES3 (la valeur par défaut pour le compilateur). Si vous êtes heureux de cibler ES5, ajoutez --target ES5à votre commande.
Manuscrit:
class MyClass {
private view;
get View() { return this.view; }
set View(value) { this.view = value }
}
Compile à:
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;
})();
Mais si vous voulez le plein contrôle de la mise en dénombrable et configurable - vous pouvez toujours utiliser le brut Object.definePropertiescode.
Je cherchais exactement la même chose quand je suis tombé sur tapuscrit Manuel: décorateurs . Au paragraphe « Méthode Décorateurs » ils définissent l' @enumerableusine de décorateur, qui ressemble à ceci (je suis tout simplement copier-coller à partir de là):
function enumerable(value: boolean) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
descriptor.enumerable = value;
};
}
et ils l'utilisent comme ceci:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
@enumerable(false)
greet() {
return "Hello, " + this.greeting;
}
}
Donc, une autre façon d'aborder, est par l'usage des décorateurs.
PS:
Cette fonction nécessite le experimentalDecoratorsdrapeau à passer à tscou mis en tsconfig.json.
Ce ne sont pas actuellement pris en charge si vous voulez que toutes les propriétés à émettre comme ça. Je recommande le dépôt d' une question sur le site de CodePlex avec des détails sur ce que votre cas et les exigences sont l' utilisation.
Si vous compilez avec --target ES5, vous pouvez avoir quelque chose comme ceci:
class n {
get foo() { return 3; }
bar() { return 5; }
}
Qui produit ce code:
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;
})();