在TypeScript中进行对象解构时重命名剩余的属性变量

时间:2018-01-18 10:07:12

标签: javascript typescript destructuring

  

修改

     

我在github上打开了与此相关的问题:   https://github.com/Microsoft/TypeScript/issues/21265
  似乎{ ...other: xother }不是有效的JS,TS,代码都不应该编译。

原始问题:

让我们假设以下示例:

const values = { a: "1", b: "2", c: "3", d: "4" };
const { a: va, b: vb, ...other } = values;

为属性va分配了新的变量名a

根据TypeScript规范,对其余属性...other执行相同操作是否有效?类似的东西:

const { a: va, b: vb, ...other: vother } = values;

我知道它有效,我已经对它进行了测试(online test)。但我无法找到它定义的地方。

引用属性重命名的文档示例始终显示" normal"案例:TypeScript Handbook - Variable Declarations。并且规范语法在规范TypeScript Spec中反映为BindingPattern没有描述(或者我已经错过)。

我的第一印象是它不是很有用,因为...other已经是自定义变量名称。但它的确有效。我很想知道它的具体定义在哪里,或者它只是一个有效的角落(我想不是)。

1 个答案:

答案 0 :(得分:4)

您提到的手册链接涵盖了您在destructuring下的示例中的大多数情景,但我认为它涵盖的一种情况未明确涵盖(仅隐式)。

您所指的特定功能(我认为)是:

的组合
  

您可以使用语法...

为对象中的其余项创建变量

  

您还可以为属性指定不同的名称:

本手册未提供使用两者的示例,如下所示。这种组合使用的有趣部分是...other令牌实际上并不意味着什么,并且从未被引用(或可引用)。在以下示例的“工作”版本中,没有错误行,other令牌根本不会出现在输出中。

这是缩短的例子:

const values = { a: "1", b: "2", c: "3", d: "4" };

const { a: one, ...other: twoThreeFour } = values;

console.log(other); // ERROR there is no variable 'other'
console.log(a, twoThreeFour); // OK

没有错误的版本 - 已编译的JavaScript在代码中的任何位置都没有引用other

const values = { a: "1", b: "2", c: "3", d: "4" };

const { a: one, ...other: twoThreeFour } = values;

console.log(a, twoThreeFour); // OK

基础语言规范中有issue to improve the clarity of the use of rest elements in relation to destructuring