Переопределить метод получения и установки дочернего свойства объекта декоратором свойства в TypeScript - PullRequest
0 голосов
/ 04 марта 2020

Я играю с декораторами, чтобы понять их ограничения и назначение. Я хотел создать простой пользовательский декоратор свойств для переопределения свойства 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.

...