typescript - 如何避免修改初始对象并改进映射?
问题描述
我有以下代码,修改初始对象并返回它:
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;
}
}
}
我认为这段代码很难理解,修改初始对象不好。如何改进这段代码?
解决方案
您想要做的是让这两个私有方法返回一个新实例,AppdocExtended
而不是修改它们收到的方法的 void 方法。如果AppdocExtended
只是一个普通的接口(不是一个类),这很容易通过对象解构来实现。
对于setSoglListSignators
,我对这个函数的解释是,如果没有设置,我们将 和 设置为一个空数组,并且我们将其设置sogllist
为这两个数组的组合。signators
soglListSignators
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">>
推荐阅读
- google-apps-script - Google-apps-script 代码段抛出错误
- r - R with parallel & pls - 如何在 Windows 中处理非终止 Rscript 进程
- android - 设备可以在前台服务之前休眠吗?
- mysql - 如何在 Node.JS 中“包装”具有多个结果的响应
- php - 访问闭包 PHP 中的实例对象
- html - 如何指示两个 html 部分是彼此的延续
- bash - makefile:如果变量为空,则在单个 make 目标上失败
- cmake - 单独构建第二个可执行文件
- c# - 用任务替换 BackGroundWorker
- php - 使用 with() 语句的 Laravel 查询