使用typescript在reduce方法中使用扩展语法进行分解

使用typescript在reduce方法中使用扩展语法进行分解,typescript,ecmascript-6,spread-syntax,Typescript,Ecmascript 6,Spread Syntax,这是我的示例,它使用别名工作。下面的示例:“aliasCatch” 通过类型脚本验证 导出类型TProcessResponseFunc=(错误:TError,stdout:TSTDOut,stderr:TSTDOut)=>void; 导出接口IObjCMD{ msg?:字符串; cmd?:字符串; func?:(fn:TProcessResponseFunc)=>无效; 捕获?:IObjCMD[]; } 常量shallowclonarrobjcmd=(arrNext:IObjCMD[])=> a

这是我的示例,它使用别名工作。下面的示例:“aliasCatch”

通过类型脚本验证
导出类型TProcessResponseFunc=(错误:TError,stdout:TSTDOut,stderr:TSTDOut)=>void;
导出接口IObjCMD{
msg?:字符串;
cmd?:字符串;
func?:(fn:TProcessResponseFunc)=>无效;
捕获?:IObjCMD[];
}
常量shallowclonarrobjcmd=(arrNext:IObjCMD[])=>
arrNext.reduce((累计,电流)=>{
让objCMD:IObjCMD=current;
如果(当前捕获){
const{…rest,catch:aliasCatch}=current;
const arrCatch:IObjCMD[]=aliasCatch?shallowclonarrobjcmd(aliasCatch):[];
objCMD={…rest,catch:arrCatch};
}
累计推力({…objCMD});
返回累计;
},[]作为IObjCMD[]);
如果替换别名以直接访问已分解的项(如下面的示例所示,即catch),则会到处出现错误:

未能通过类型脚本验证
const shallowclonarrobjcmd=(arrNext:IObjCMD[])=>
arrNext.reduce((累计,电流)=>{
让objCMD:IObjCMD=current;
如果(当前捕获){
const{…rest,catch}=当前;
常量arrCatch:IObjCMD[]=catch?shallowclonarrobjcmd(catch):[];
objCMD={…rest,catch};
}
累计推力({…objCMD});
返回累计;
},[]作为IObjCMD[]);
常量{…rest,catch}=current;-在结尾的大括号上显示错误:应为:这将中断代码的其余部分

我所能想到的唯一原因是,正如我在接口中声明的那样,我的变量“catch”可能未定义。因此,将其设置为别名是通过将其指定给变量/aka别名来绕过对变量具有值的即时需求

对此进行一些澄清会有所帮助。谢谢

捕获
是一个很好的方法。不能将其用作变量名
current.catch
可以,但是
const{…rest,catch}=current
不行

我建议避免将
catch
(以及其他保留字,如
delete
class
)作为属性名。如果不能,您可能需要使用注释来告诉您的linter不要坚持破坏结构:

/* eslint-disable prefer-destructuring */
const arrCatch: IObjCMD[] = current.catch
  ? shallowCloneArrObjCMD(current.catch)
  : [];
objCMD = { ...current };

catch
是一个保留关键字,用于try/catch-on-with-promissions。您不能使用任何保留关键字作为独立变量,只要想象一下使用名为
if
else
for
,等等的变量就可以了。谢谢。关键字作为属性名没有问题-
.delete()
.catch()
一直在使用-但是是的,在声明变量时必须使用别名。