Поскольку вся информация об интерфейсах отбрасывается во время компиляции, это невозможно. Реализация somedecorator не может получить доступ к информации, которая была отброшена компилятором.
Возможна передача имен интерфейсов декоратору в виде строк, однако это не очень полезно, поскольку вся информация, предоставляемая интерфейсами, будет потеряна во время выполнения.
Хороший вопрос о переполнении стека о реализации декораторов:
Как реализовать декоратор машинописного текста?
Редактировать:
Итак, после некоторого изучения этого вопроса ответ на ваш вопрос все еще нет. По двум причинам:
- Никакая информация об интерфейсах не может быть доступна после времени компиляции (с декораторами или без них).
- Декораторы не получают доступа к унаследованным свойствам класса.
Некоторые примеры, чтобы проиллюстрировать это:
function myDecorator() {
// do something here..
}
interface INamed { name: string; }
interface ICounted { getCount() : number; }
interface ISomeOtherInterface { a: number; }
class SomeClass {
constructor() { }
}
class Foo implements INamed {
constructor(public name: string) { }
}
@myDecorator
class Bar extends Foo implements ICounted {
private _count: number;
getCount() : number { return this._count; }
constructor(name: string, count: number, public someProp: ISomeOtherInterface, public someClass: SomeClass) {
super(name);
this._count = count;
}
}
Это приведет к скомпилированному коду (с флагом --emitDecoratorMetadata):
function myDecorator() {
// do something here..
}
var SomeClass = (function () {
function SomeClass() {
}
return SomeClass;
})();
var Foo = (function () {
function Foo(name) {
this.name = name;
}
return Foo;
})();
var Bar = (function (_super) {
__extends(Bar, _super);
function Bar(name, count, someProp, someClass) {
_super.call(this, name);
this.someProp = someProp;
this.someClass = someClass;
this._count = count;
}
Bar.prototype.getCount = function () { return this._count; };
Bar = __decorate([
myDecorator,
__metadata('design:paramtypes', [String, Number, Object, SomeClass])
], Bar);
return Bar;
})(Foo);
Любая информация, которая будет нам доступна в декораторе (кроме самого класса), содержится в части __decorate:
__decorate([
myDecorator,
__metadata('design:paramtypes', [String, Number, Object, SomeClass])
], Bar);
В настоящее время никакая информация о наследовании или интерфейсах не передается декораторам. Все, что делает декоратор класса, — это украшает конструктор. Это, вероятно, не изменится, особенно для интерфейсов (поскольку вся информация о них удаляется во время компиляции).
Как видно из массива типов __metadata, мы получаем информацию о типах для String, Number и класса SomeClass (аргументы конструктора). Но интерфейс ISomeOtherInterface сообщается как Object, потому что в скомпилированном javascript не сохраняется никакой информации об интерфейсах typescript. Таким образом, лучшая информация, которую мы можем получить, это Object.
Вы можете использовать что-то вроде https://github.com/rbuckton/ReflectDecorators, чтобы лучше работать с декораторами, но вы по-прежнему сможете получить доступ только к информации в __decorate и __metadata.
Итак, резюмируя. В декораторе нет информации о наследовании или интерфейсах для класса. Интерфейсы, скорее всего, никогда не будут доступны декоратору (или где-либо еще в скомпилированном коде).
person
Nypan
schedule
12.05.2015