Как написать декоратор, который делает свойство доступным только для чтения в Typescript? - PullRequest
0 голосов
/ 11 октября 2019

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

Функция декоратора свойства может иметь два или три аргумента. Когда я пишу такой код.

class Circle {
  @readonly
  public magic: number = 3.14159;
}

Третий параметр всегда не определен, и я не могу просто вернуть новый дескриптор, так как мне нужно значение для инициализации свойства.

Я пыталсяиспользовать набор и обойти проблему инициализации. Что-то вроде:

function readonly(target: any, key: string, descriptor?: PropertyDescriptor) {
  if (descriptor) {
    descriptor.writable = false;
    return descriptor;
  }
  return {
    get: function get() {
      // Return the stored value for the instance.
    },
    set: function set() {
      // Check if it is the first time to set value.
      // If true store the value, else console.error.
    }
  };
}

И это похоже на работу, поскольку конструктор устанавливает значение свойства только один раз.

Однако, когда я пытался расширить класс, например:

class Circle {
  @readonly
  public magic: number = 3.14159;
}
class SemiCircle extends Circle {
  @readonly
  public magic: number = 3.14159 / 2.0;
}

Конструктор SemiCircle установит магию дважды, сначала в super (конструктор Circle), а затем в одиночку.

Есть ли способ справиться с этой проблемой. Listing 3 - Proposed JavaScript output:, который имеет инициализатор в дескрипторе https://github.com/Microsoft/TypeScript/issues/4736, может работать для меня, но проблема, кажется, приостановлена ​​из-за устаревшего предложения.

Должен ли я найти установщик и получатель иполучить счетчик set в consturctor или написать преобразователь машинописи (плагин) самостоятельно?

...