Ответ 1
Ваш код действительно работает, но вы вводите в заблуждение console.log
Ключи слабой карты не перечислимы, поэтому она кажется пустой. Но вызовите метод get
или has
, и вы увидите, что это не так.
Я пытаюсь реализовать декораторы TypeScript, как показано в this, this и эта ссылка. Я получил свой проект, но у меня возникла проблема, когда нужно получить некоторые значения из Decorator.
Во-первых, связанные классы:
SerializeDecorator.ts
let toSerialize = new WeakMap();
// for each target (Class object), add a map of property names
export function serialize(target: any, key: string) {
console.log("Target = " + target + " / Key = " + key);
let map = toSerialize.get(target);
if (!map) {
map = [];
toSerialize.set(target, map);
}
map.push(key);
console.log(toSerialize);
}
export function print() {
console.log(toSerialize);
}
/* not used for now
export function getArray() {
return toSerialize;
}
export function value(key: string) {
return this[key];
}
*/
DeviceClass.ts
import * as serializer from "./SerializeDecorator";
export class Device {
@serializer.serialize
private deviceid: number;
private indication: number;
private serialnumber: number;
private type: string = "MEMS6";
private value: string;
public constructor(id: number = 1, indic: number = 1, serial: number = 200001) {
this.deviceid = id;
this.indication = indic;
this.serialnumber = serial;
}
public getDeviceid(): number {
return this.deviceid;
}
public setDeviceid(i: number) {
this.deviceid = i;
}
public getIndication(): number {
return this.indication;
}
public setIndication(i: number) {
this.indication = i;
}
public getSerialnumber(): number {
return this.serialnumber;
}
public setSerialnumber(i: number) {
this.serialnumber = i;
}
public getType(): string {
return this.type;
}
public setType(s: string) {
this.type = s;
}
public getValue(): string {
return this.value;
}
public setValue(s: string) {
this.value = s;
}
public toJSON(): any {
serializer.print();
// just to return some value ...
return {
"test": "test"
};
}
}
Моя цель
Я хочу, чтобы все свойства были сериализованы на (Слабой) карте, хранящейся у Decorator. Затем, как только все свойства были помещены в Карту, я хотел бы получить имя свойства и его значение при вызове переопределенной функции toJSON
. (A for
, зацикливание на каждом key
для желаемого target
и извлечение value
)
Моя проблема
Когда я вызываю serializer.print()
, как показано, я ожидаю увидеть что-то вроде:
WeakMap: {[Объект объекта]: [ "deviceid" ]}
Но вместо этого я получил это:
WeakMap: {}
Мой вопрос
Конечно, я хочу знать, возможно ли то, что я хочу достичь, или нет. И если это возможно, каковы причины, из-за которых моя WeakMap пуста? Я не очень хорошо знаком с синтаксисом Decorator (например, class
), может ли быть так, что факт, что он не является "действительно" объектом, делает невозможным сохранение ссылок?
Ваш код действительно работает, но вы вводите в заблуждение console.log
Ключи слабой карты не перечислимы, поэтому она кажется пустой. Но вызовите метод get
или has
, и вы увидите, что это не так.