在TypeScript中销毁对象时重命名其余属性变量

Tob*_*ías 3 javascript destructuring typescript

编辑:

我在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;
Run Code Online (Sandbox Code Playgroud)

其中va为property分配了新的变量名a

根据TypeScript规范,对其余属性执行相同操作是否有效...other?就像是:

const { a: va, b: vb, ...other: vother } = values;
Run Code Online (Sandbox Code Playgroud)

我知道它有效,我已经对其进行了测试(在线测试)。但是我无法找到它的定义位置。

引用属性重命名的文档示例始终显示“正常”情况:TypeScript手册-变量声明。规范语法引用了规范中BindingPattern未描述(或我错过了)的:TypeScript Spec

我的第一印象是它不是很有用,因为...other它已经是一个自定义变量名。但这有效。而且我很想知道它的具体定义是什么,或者这仅仅是一个极端的案例(我想不是)。

Fen*_*ton 5

您提到的手册链接涵盖了您的示例中解构后的大多数情况,但是我认为它所涉及的一种情况并未明确涵盖(仅是隐含的)。

您指的(我认为)特定功能是以下各项的组合:

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

您还可以为属性指定其他名称:

手册没有给出使用这两种方法的示例,如下所示。这种组合使用的有趣之处在于,...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
Run Code Online (Sandbox Code Playgroud)

而没有错误的版本-编译的JavaScript other在代码中没有引用任何地方:

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

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

console.log(a, twoThreeFour); // OK
Run Code Online (Sandbox Code Playgroud)

存在一个问题,与基础语言规范中的解构有关提高了使用rest元素的清晰度