Tengo el siguiente código, que modifica el objeto inicial y lo devuelve:

this.appdocspackets = this.appdocspackets.map((docpacket) => {
            let headDocument = this.setHeadDocument(docpacket.appdocs, docpacket.headappdocid);

            this.setSoglListSignators(headDocument);
            this.setCurrentPodpisant(headDocument);

            return {
                ...docpacket,
                headappdoc: headDocument,
            };
        });

Dentro de este método puedes ver dos métodos:

   this.setSoglListSignators(headDocument);
   this.setCurrentPodpisant(headDocument);

Los métodos son:

private setSoglListSignators(headDocument: AppdocExtended): void {
    let soglListSignators = [];

    if (headDocument.sogllist) {
        soglListSignators = soglListSignators.concat(headDocument.sogllist);
    } else {
        headDocument.sogllist = [];
    }

    if (headDocument.signators) {
        soglListSignators = soglListSignators.concat(headDocument.signators);
    } else {
        headDocument.signators = [];
    }

    headDocument.soglListSignators = soglListSignators;
}


private setCurrentPodpisant(headDocument: AppdocExtended): void {
    const podpisantOrSignator = this.mapCurrentPodpisantOrSignator(headDocument.podpisant, headDocument.soglListSignators);
    if (podpisantOrSignator) {
        if (podpisantOrSignator.signid) {
            headDocument.currentPodpisant = podpisantOrSignator;
        }

        if (podpisantOrSignator.soglid) {
            headDocument.currentSignator = podpisantOrSignator;
        }
    }
}

Creo que este código es difícil de entender y no es bueno modificar el objeto inicial. ¿Cómo mejorar este código?

-1
Jessy 21 oct. 2020 a las 22:13

1 respuesta

La mejor respuesta

Lo que quiere hacer es que esos dos métodos privados devuelvan una nueva instancia de AppdocExtended en lugar de ser métodos nulos que modifiquen el que reciben. Si AppdocExtended es solo una interfaz simple (no una clase), esto es fácil de hacer con la desestructuración de objetos.

Para setSoglListSignators, mi interpretación de esta función es que configuramos sogllist y signators a una matriz vacía si no están configurados y configuramos soglListSignators a la combinación de esos dos matrices.

  private setSoglListSignators(headDocument: AppdocExtended): AppdocExtended {

    // default to empty array if not set
    const { sogllist = [], signators = [], ...rest } = headDocument;

    return {
      ...rest,
      sogllist,
      signators,
      soglListSignators: [...sogllist, ...signators]
    }
  }

Si queremos ser muy explícitos sobre nuestros tipos de devolución, podemos decirle a mecanografiado que las tres propiedades que establecemos ahora definitivamente existen en el objeto devuelto, mientras que antes eran opcionales.

private setSoglListSignators(headDocument: AppdocExtended): AppdocExtended & Required<Pick<AppdocExtended, "soglListSignators" | "sogllist" | "signators">>
2
Linda Paiste 21 oct. 2020 a las 20:44