Как получить TypeScript, чтобы испускать определения свойств, такие как:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Как получить TypeScript, чтобы испускать определения свойств, такие как:
Object.defineProperties(this, {
view: {
value: view,
enumerable: false,
writable: false,
configurable: false
},
});
Я искал точно то же самое, когда наткнулся на TypeScript Справочник: Декораторы. В параграфе "Декораторы методов" они определяют @enumerable
decorator factory, который выглядит следующим образом (я просто копирую в этом случае):
function enumerable(value: boolean) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
descriptor.enumerable = value;
};
}
и они используют его следующим образом:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
@enumerable(false)
greet() {
return "Hello, " + this.greeting;
}
}
Таким образом, другой способ обращения к нему - использование декораторов.
PS:
Для этой функции требуется, чтобы флаг experimentalDecorators
передавался в tsc
или устанавливался в tsconfig.json
.
Вы можете использовать get
и set
в TypeScript, которые скомпилируются в Object.defineProperties
.
Это функция ECMAScript 5, поэтому вы не можете ее использовать, если вы настроили таргетинг на ES3 (по умолчанию для компилятора). Если вы настроены на таргетинг на ES5, добавьте --target ES5
в свою команду.
TypeScript:
class MyClass {
private view;
get View() { return this.view; }
set View(value) { this.view = value }
}
Скомпилируется:
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;
})();
Но если вы хотите, чтобы полный контроль над настройкой был перечислимым и настраиваемым, вы все равно можете использовать код raw Object.defineProperties
.
В настоящее время это не поддерживается, если вы хотите, чтобы все свойства были выбраны так. Я бы рекомендовал зарегистрировать проблему на сайте CodePlex с подробной информацией о том, что ваш прецедент и требования.
Если вы скомпилируете с --target ES5, вы можете иметь что-то вроде этого:
class n {
get foo() { return 3; }
bar() { return 5; }
}
Что производит этот код:
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;
})();