使用打字稿在reduce方法中使用扩展语法进行解构
Posted
技术标签:
【中文标题】使用打字稿在reduce方法中使用扩展语法进行解构【英文标题】:Destructuring with spread syntax in reduce method using typescript 【发布时间】:2021-01-08 18:39:01 【问题描述】:这是我的示例,它使用别名。下面的例子:'aliasCatch'
通过打字稿验证
export type TProcessResponseFunc = (error: TError, stdout: TSTDOut, stderr: TSTDOut) => void;
export interface IObjCMD
msg?: string;
cmd?: string;
func?: (fn: TProcessResponseFunc) => void;
catch?: IObjCMD[];
const shallowCloneArrObjCMD = (arrNext: IObjCMD[]) =>
arrNext.reduce((accum, current) =>
let objCMD: IObjCMD = current;
if (current.catch)
const ...rest, catch: aliasCatch = current;
const arrCatch: IObjCMD[] = aliasCatch ? shallowCloneArrObjCMD(aliasCatch) : [];
objCMD = ...rest, catch: arrCatch;
accum.push( ...objCMD );
return accum;
, [] as IObjCMD[]);
如果我替换别名以直接访问已解构的项目 - 即 catch,在下面的示例中,那么我会得到到处都是错误:
打字稿验证失败
const shallowCloneArrObjCMD = (arrNext: IObjCMD[]) =>
arrNext.reduce((accum, current) =>
let objCMD: IObjCMD = current;
if (current.catch)
const ...rest, catch = current;
const arrCatch: IObjCMD[] = catch ? shallowCloneArrObjCMD(catch) : [];
objCMD = ...rest, catch;
accum.push( ...objCMD );
return accum;
, [] as IObjCMD[]);
const ...rest, catch = current; - 在大括号末尾给我错误:预期:这会破坏其余代码。
我能想到的唯一原因是因为我的变量“catch”可能未定义,正如我在接口中声明的那样。因此,通过将其分配给变量/别名别名,使其成为别名绕过了对变量具有价值的直接需求。
对此进行一些澄清会有所帮助。谢谢
【问题讨论】:
catch
是与 try/catch 一起使用的保留关键字。您不能使用任何保留关键字作为独立变量,想象一下使用名为if
、else
、for
等的变量。
【参考方案1】:
catch
是一个reserved word。您不能将其用作变量名。 current.catch
可以,但const ...rest, catch = current
不行。
我建议完全避免将catch
(以及其他保留字,如@987654326@ 或class
)作为属性名称。如果不能,您可能需要使用 cmets 告诉您的 linter 不要坚持解构:
/* eslint-disable prefer-destructuring */
const arrCatch: IObjCMD[] = current.catch
? shallowCloneArrObjCMD(current.catch)
: [];
objCMD = ...current ;
【讨论】:
啊——很好看。谢谢。 将关键字作为属性名称并没有错 -.delete()
和 .catch()
一直在使用 - 但是是的,在声明变量时必须给它们起别名。以上是关于使用打字稿在reduce方法中使用扩展语法进行解构的主要内容,如果未能解决你的问题,请参考以下文章
如何使用打字稿在angular2中获取设备显示的高度和宽度?