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