TypeScript: использование декораторов для пользовательской сериализации JSON

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

Ответы

Ответ 1

Ваш код действительно работает, но вы вводите в заблуждение console.log

Ключи слабой карты не перечислимы, поэтому она кажется пустой. Но вызовите метод get или has, и вы увидите, что это не так.