Для экземпляров справочных данных я бы хотел, чтобы получатели самостоятельно заменяли возвращаемым значением - PullRequest
0 голосов
/ 29 мая 2018

Мое приложение загружает экземпляры справочных данных.Некоторые экземпляры имеют геттеры, которые используют данные из других справочных данных.Например:

class Person{
  name: string 
  cityId: number

  get city(): City {
    return City.all.get(this.cityId)!
  }
}

Поскольку справочные данные никогда не меняются, вызов метода получения всегда будет возвращать один и тот же результат.Поэтому я хотел бы сделать геттер, который заменит себя своим результатом.Я думал о декораторе, как это:

export const selfReplacing = <T>(target: T, propertyKey: keyof T, descriptor: PropertyDescriptor): any => {
  const oldGetter = descriptor.get!
  descriptor.get = function (this: T) {
    const value = oldGetter.call(this)
    Object.defineProperty(this, propertyKey, {
      value,
      enumerable: true
    })
    return value
  }
}

Что я мог бы использовать так:

class Person{
  name: string 
  cityId: number

  @selfReplacing
  get city(): City {
    return City.all.get(this.cityId)!
  }
}

Это лучший способ сделать это?

1 Ответ

0 голосов
/ 29 мая 2018

Переопределение дескриптора свойства при доступе к первому свойству - лучший способ сделать это.

В качестве альтернативы, значение может быть кэшировано в локальную переменную или, что лучше, свойство:

export const selfReplacing = <T>(target: T, propertyKey: keyof T, descriptor: PropertyDescriptor): any => {
  const oldGetter = descriptor.get!
  const cacheKey = Symbol(`${propertyKey} cache`);
  descriptor.get = function (this: T) {
    if (!(cacheKey in this))
      this[cacheKey] = oldGetter.call(this);

    return return this[cacheKey];
  }
}

Может быть полезно, если какая-то стратегия кэширования должна быть реализована дополнительно (срок действия кэша и т. Д.).

...