Typescript-klasse med standardverdier, hvordan parse JSON til denne


Jeg har en klasse av typen A. Denne klassen har flere egenskaper, la oss kalle dem prop1, prop2 og prop3.

Når jeg kaller en API som returnerer en JSON-streng som representerer objektet, kan noen egenskaper bli utelatt hvis de er null. Lenger frem i prosessen brukes imidlertid dette objektet til å konstruere et skjema dynamisk (ved bruk av Formik, men det er ikke relevant). Dette rammeverket forventer at alle egenskapene er til stede, og noen vil være synlige dynamisk avhengig av andre egenskaper.

Så mitt spørsmål er, hvordan kan jeg analysere et JSON-svar til min egen klasse, og beholde standardverdier hvis egenskaper utelates i API-svaret?

Det jeg har prøvd var:

static getCustomer(id) {
        return fetch(process.env.MD_API_URL + 'customers/' + id, { mode: 'cors' })
            .then(response => {
                let cust = new Customer();
                return response.json().then(x => cust = JSON.parse(x));
        }).catch(error => {
            return error;
        });
    }

Men dette returnerer udefinert. Må gjøre noe feil...

Svar #1

siden typescript faktisk ikke blir kompilert, men oversatt til javascript, så gjelder alle javascript-reglene.

Derfor vil ikke deserialisering av JSON faktisk opprette en ny instans av den aktuelle klassen, men gir deg et objekt du kan «kalle» Customer under designtid.

du kan imidlertid opprette et objekt og deretter tilordne JSON-verdiene slik:

export class Customer {

   public id: number;
   public name: string;

   // your stuff here
   public myDefaultProp: string = "default value";

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

ditt returresultat ville da se slik ut:

return response.json().then(x => new Customer(JSON.parse(x)));

la til et eksempel https://stackblitz.com/edit/typescript-16wlmg

Svar #2

Dette er i utgangspunktet bare et spørsmål om å bestemme hva som må gjøres for å opprette en forekomst av en klasse, og kartlegge egenskapene til et JSON-svar mot din egendefinerte klasse, og det kan være mange forskjellige måter å løse dette på.

Men jeg tror (Fabrikkfunksjon) er en passende tilnærming for denne typen oppgave.

Relaterte artikler