Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierChlouchloutte ¯\_(ツ)_/¯

Note: Nested Copy in Typescript - sans classe de serializer

27 avril 2020 à 10:55

Désérialiser des objets depuis le JSON vers des entités typées en Typescript est un besoin que l'on peut rencontrer n'importe quand.

Voici ce que je fais de mon côté, afin de pouvoir profiter pleinement des méthodes de mes objets.

Pour un objet simple, ceci suffit :

export class Identity {

    public name: string;
    public age: number;

    public constructor(init?: Partial<Identity>) {
        Object.assign(this, init); 
    }
}

Dès que l'on commence à avoir des collections, il faut ajouter un peu d'intelligence (on part du principe que la classe Adress aura un constructeur qui permet cette initialisation, voir dessous) :

export class Contact {

    public adresses: Address[];
    public phone: string;

    public constructor(init?: Partial<Contact >) {
        Object.assign(this, init); 
       if (init != null) {
            this.adresses= init.adresses== null ? [] : init.adresses.map(it => new Address(it));
        }
    }
}
export class Address{

    public city: string;

    public constructor(init?: Partial<Address>) {
        Object.assign(this, init); 
    }
}

Si on a des "nested objects", donc des classes qui ont d'autres classes en attribut, on fait comme ceci :

export class Person {

    public identity: Identity;
    public contact: Contact;

    public constructor(init?: Partial<Person>) {
        Object.assign(this, init); 
       if (init != null) {
            this.identity= init.identity== null ? null : new Identity(init.identity);
            this.contact= init.contact== null ? null : new Contact(init.contact);
        }
    }
}

Et enfin, comment on s'en sert - dans les grandes lignes (passke quand même, hein !):

return this.http.get(`/api/person/${personId}`)
            .toPromise()
            .then((response: any) => new Person(JSON.parse(response)) );

Permalien

❌
❌