首页 > 解决方案 > 如何避免修改初始对象并改进映射?

问题描述

我有以下代码,修改初始对象并返回它:

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

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

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

在此方法中,您可以看到两种方法:

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

方法是:

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;
        }
    }
}

我认为这段代码很难理解,修改初始对象不好。如何改进这段代码?

标签: typescript

解决方案


您想要做的是让这两个私有方法返回一个新实例,AppdocExtended而不是修改它们收到的方法的 void 方法。如果AppdocExtended只是一个普通的接口(不是一个类),这很容易通过对象解构来实现。

对于setSoglListSignators,我对这个函数的解释是,如果没有设置,我们将 和 设置为一个空数组,并且我们将其设置sogllist为这两个数组的组合。signatorssoglListSignators

  private setSoglListSignators(headDocument: AppdocExtended): AppdocExtended {

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

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

如果我们想非常明确地说明我们的返回类型,我们可以告诉 typescript 我们现在设置的三个属性肯定存在于返回的对象上,而它们之前是可选的。

private setSoglListSignators(headDocument: AppdocExtended): AppdocExtended & Required<Pick<AppdocExtended, "soglListSignators" | "sogllist" | "signators">>

推荐阅读