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

17

编辑:

我在Github上提出了与此相关的问题: https://github.com/Microsoft/TypeScript/issues/21265
看起来{ ...other: xother }不是有效的JavaScript或TypeScript代码,甚至不应该编译。

原始问题:

假设以下示例:

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

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

根据TypeScript规范,对于其余属性...other是否可以做相同的操作?比如:

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

我知道它可以工作,我已经进行了测试 (在线测试)。但我找不到它定义的位置。

文档示例中引用属性重命名的部分总是显示“正常”的情况:TypeScript手册-变量声明。规范语法则提到了一个未在规范中描述(或我错过了)的BindingPatternTypeScript规范

我的第一印象是它不是很有用,因为...other已经是一个自定义变量名。但它起作用。我好奇地想知道它具体是在哪里定义的,或者它只是一个可以工作的特殊情况(我认为不是)。


1
你正在提到 Rest/Spread 属性,它们尚未成为 ECMAScript 的正式部分,而只是一个提案规范)。 - str
1个回答

14

你提到的手册链接涵盖了你在解构下举例的大多数情况,但我认为它只隐含地而不是明确地覆盖了其中一种情况。

你所指的特定功能(我想)是以下两者的组合:

您可以使用语法...为对象中的其余项创建变量:

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

手册没有给出同时使用两者的示例,如下所示。这种组合使用的有趣部分是,...other标记实际上并不意味着任何东西,也永远不会被引用(或可引用)。在下面的示例的"working"版本中,如果没有错误行,则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

在底层语言规范中,关于解构与剩余元素的使用清晰性需要改进


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接