Я играю с декораторами, чтобы понять их ограничения и назначение. Я хотел создать простой пользовательский декоратор свойств для переопределения свойства id в объекте.
Вызов:
@Component({...})
export class PageComponent{
...
data:object[] = [];
columns:TableColumn[] = [];
@Table({id: 'myTableId'}) table = new MyTable(this.data, this.columns);
...
}
Декоратор:
export function Table(options:any):(target:any, propertyKey:string|symbol)=>void{
return function(target:any, propertyKey:string){
let IDgetter = ():string => {
return options.id;
}
let IDsetter = (id:string)=>{
target[propertyKey].id=options.id;
}
console.log(target, propertyKey, target[propertyKey], options);
// PageComponent, 'table', undefined, {id: 'myTableId'}
if (delete target[propertyKey].id){
Object.defineProperty(target[propertyKey], 'id', {
get: IDgetter,
set: IDsetter,
enumerable: true,
configurable: true
});
}
}
}
Как показывает комментарий, я не может достичь идентификатора, потому что target [propertyKey] не определен. Хорошо, я понимаю, что объект еще не существует, и поэтому значение еще не установлено в контексте. Есть ли другой способ реализовать что-то подобное?
Моя цель - создать цепочку декораторов, где я могу использовать декораторы для добавления функций в новый экземпляр MyTable
, например:
@Table({id: 'myTableId'})
@CustomizableColumns({
defaultColumns: ['date', 'name', 'age', 'gender']
})
@filterTable(((row:object) => { return age > 18 }).bind(this))
table = new MyTable([...], ['date', 'age', 'name', 'gender', 'id', 'number', 'v', ...])
С другой стороны, все эти декораторы связаны с проблемой, я не могу достичь дочерних свойств экземпляра MyTable.