【问题标题】:Destructuring with spread syntax in reduce method using typescript使用打字稿在reduce方法中使用扩展语法进行解构
【发布时间】: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 一起使用的保留关键字。您不能使用任何保留关键字作为独立变量,想象一下使用名为ifelsefor 等的变量。

标签: typescript ecmascript-6 spread-syntax


【解决方案1】:

catch 是一个reserved word。您不能将其用作变量名。 current.catch 可以,但const { ...rest, catch } = current 不行。

我建议完全避免将catch(以及其他保留字,如@9​​87654326@ 或class)作为属性名称。如果不能,您可能需要使用 cmets 告诉您的 linter 不要坚持解构:

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

【讨论】:

  • 啊——很好看。谢谢。
  • 将关键字作为属性名称并没有错 - .delete().catch() 一直在使用 - 但是是的,在声明变量时必须给它们起别名。
猜你喜欢
  • 2019-06-27
  • 2016-02-01
  • 2020-07-07
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多