修改
我在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
已经是自定义变量名称。但它的确有效。我很想知道它的具体定义在哪里,或者它只是一个有效的角落(我想不是)。
答案 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。