Búsqueda de sitios web

typescript - Angular 2 no puede hacer constante el JSON de objetos de modelos


Problema: La variable constante con valor como un arreglo de modelos está cambiando sin ningún cambio directo en esa variable.

Mi modelo es :

export class Section {

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

Ahora tengo que declarar una variable de arreglo predeterminada de este modelo que debe ser constante en todas partes del proyecto

El JSON apropiado para este modelo es :

SECTIONS_CONST: Section[] = [ 

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

Nota: Esta matriz funciona correctamente en mi código, pero el único problema es que en esta matriz ningún valor debe cambiar de ninguna manera.

Probé muchas formas como se indica a continuación :

  • Hice esta variable privada en la clase y mediante un método getter devuelve el valor de esta variable
  • Exporta esta variable como constante
  • Intentó Object.assign({}, tuObjeto);
  • Intenté Object.freeze()
  • Intenté _.cloneDeep()

Y muchas más cosas intenté.

Todavía intentando con diferentes soluciones pero no puedo hacer que nada funcione.

Respuesta #1

¿Has investigado sobre ReadonlyArray combinado con const?

const SECTIONS_CONST: ReadonlyArray<Section> = ...

Con ReadonlyArray no podrás añadir ni cambiar elementos:

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

Y const previene la reasignación:

// Not allowed
SECTIONS_CONST = [];

Sin embargo, aún puedes cambiar una propiedad en un elemento existente:

SECTIONS_CONST[0].sectionId = null;

Así que también puede que quieras hacer que las propiedades de Section sean de solo lectura:

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

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