typescript - Angular 2 kan inte göra modellobjekts JSON konstant


Problem: Konstant variabel med värde som en matris av modeller ändras utan någon direkt ändring i den variabeln.

Min modell är :

export class Section {

    sectionId : string;
    sectionLabel : string;
    sectionIcon : string;
    sectionComponents : Array<SectionComponent>; 
}

Nu måste jag deklarera en standard array-variabel av denna modell som måste vara konstant överallt i projektet

Lämplig json för denna modell är :

SECTIONS_CONST: Section[] = [ 

          {
            sectionId: 'testId',
            sectionLabel: 'testLabel',
            sectionIcon : 'testIcon',
            sectionComponents : [
                      {
                        sectionComponentId : 'testSectionComponentId',
                        label : 'test label',
                        inputModels : [
                           {
                             inputName : 'testName',
                             model : ''
                           }
                          ],
                        componentBasedData : null,
                        selectedQuerys : []
                      }
                ]
          }
]

Observera: Denna array fungerar korrekt i min kod, men det enda problemet är att inga värden i denna array får ändras på något sätt.

Jag försökte många sätt som nedan :

  • Gjorde denna variabel privat i klassen och returnerar värdet av denna variabel med en getter-metod
  • Exportera denna variabel som konstant
  • Försökte Object.assign({}, dittObjekt);
  • Försökte Object.freeze()
  • Försökte _.cloneDeep()

Och mycket mer saker jag försökte.

Fortsätter att prova med olika lösningar men kan inte få något att fungera.

Svar #1

Har du tittat på ReadonlyArray kombinerat med const?

const SECTIONS_CONST: ReadonlyArray<Section> = ...

Med ReadonlyArray kommer du inte att kunna lägga till eller ändra objekt:

// Not allowed
SECTIONS_CONST.push( ... );
SECTIONS_CONST[0] = ...

Och const förhindrar omtilldelning:

// Not allowed
SECTIONS_CONST = [];

Du kan dock fortfarande ändra en egenskap på ett befintligt objekt:

SECTIONS_CONST[0].sectionId = null;

Så du kanske också vill göra egenskaperna hos Section skrivskyddade:

export class Section {
    readonly sectionId : string;
    // etc
}

// Not allowed
SECTIONS_CONST[0].sectionId = null;