2016-12-15 2 views
0

Ich versuche, Typoskript Dekorateure zu implementieren, wie in this, Link this und this gesehen. Ich habe mein Projekt ausgeführt, aber ich habe ein Problem, wenn es darum geht, einige Werte vom Decorator abzurufen.Typoskript: Mit Dekorateure für benutzerdefinierte JSON Serialisierung

Zunächst werden die verwandten Klassen:

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" 
     }; 
    } 
} 

Mein Ziel

Ich möchte alle zu serialisierenden Eigenschaften in eine (schwache) Karte setzen, die vom Dekorateur gehalten wird. Nachdem alle Eigenschaften in der Map platziert wurden, möchte ich den Namen der Eigenschaft und ihren Wert abrufen, wenn die überschriebene toJSON-Funktion aufgerufen wird. (A for Schleife auf jeder key für eine gewünschte target Looping und Abrufen der value)

Mein Problem

Als ich serializer.print() nennen, wie gezeigt, erwarte ich so etwas wie zu sehen:

WeakMap: {[Objekt Objekt]: ["Gerät ID"]}

Aber ich habe t sein statt:

WeakMap: {}

Meine Frage

Natürlich möchte ich wissen, ob das, was ich will ist möglich oder nicht erreichen. Und wenn es möglich ist, was sind die Ursachen, die meine WeakMap leer machen? Ich bin nicht sehr vertraut mit der Decorator-Syntax (zB class), könnte es also sein, dass die Tatsache, dass es nicht "wirklich" ein Objekt ist, es unmöglich macht, Referenzen zu behalten?

+1

Ihr Code funktioniert für mich (in Spielplatz) –

Antwort

1

Ihr Code funktioniert zwar, aber sie von den console.log

Tasten eines weakmap die Irre geführt werden, sind nicht abzählbar, so dass es leer erscheint. Aber rufen Sie die get oder has Methode, und Sie werden sehen, dass es nicht der Fall ist.

+0

Vielen Dank @JMontupet für Ihre Klarstellung! Du hast recht, es war von Anfang an richtig. Ich habe 'get' aufgerufen und konnte die Werte abrufen. Nochmals vielen Dank ! – Jacks

Verwandte Themen