Cum pot obține typescript să emită definiții de proprietate, cum ar fi:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Cum pot obține typescript să emită definiții de proprietate, cum ar fi:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Puteți folosi getși setdactilografiat, care compila în Object.defineProperties.
Aceasta este o caracteristică ECMAScript 5, astfel încât să nu se poate utiliza dacă vizați ES3 (implicit pentru compilator). Dacă sunteți fericit să vizați ES5, adăugați --target ES5la comanda.
typescript:
class MyClass {
private view;
get View() { return this.view; }
set View(value) { this.view = value }
}
Compilează la:
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;
})();
Dar dacă doriți un control complet al setarea enumerable și configurabil - ai putea folosi în continuare brut Object.definePropertiescod.
Am fost în căutarea pentru exact același lucru atunci când am dat peste typescript Manual: decoratori . În „Metoda Decoratorii“ punctul ei definesc @enumerablefabrica decorator, care arata ca acest lucru (eu sunt pur și simplu copiați-lipirea de acolo):
function enumerable(value: boolean) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
descriptor.enumerable = value;
};
}
și o folosesc ca aceasta:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
@enumerable(false)
greet() {
return "Hello, " + this.greeting;
}
}
Deci, un alt mod de a aborda aceasta, este prin utilizarea de decoratori.
PS:
Această funcție necesită experimentalDecoratorspavilion să fie transmise tscsau stabilit în tsconfig.json.
Acest lucru nu este acceptată în prezent , dacă doriți ca toate proprietățile să fie emise așa. Aș recomanda depunerea unei probleme la site - ul CodePlex cu detalii despre modul dvs. de utilizare și cerințele sunt.
Dacă faci compila cu --target ES5, puteți avea ceva de genul:
class n {
get foo() { return 3; }
bar() { return 5; }
}
Care produce acest cod:
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;
})();