编辑:
我在github上打开了一个与此相关的问题: https://github.com/Microsoft/TypeScript/issues/21265
看来不是有效的JS,也不是TS,代码,它甚至不应该编译。{ ...other: xother }
原问题:
我们假设以下示例:
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;
我知道它有效,我已经测试过它(在线测试)。但我无法找到它的定义位置。
涉及属性重命名的文档示例始终显示“正常”情况:TypeScript 手册 - 变量声明。规范语法引用了规范中未描述(或我错过了)的
BindingPattern
:TypeScript Spec。
我的第一印象是它不是很有用,因为
...other
已经是一个自定义变量名称。但它有效。我很想知道它是在哪里具体定义的,或者它是否只是一个有效的极端情况(我想不是)。
您提到的手册链接涵盖了示例中“解构”下的大部分场景,但我认为它所涵盖的一种情况并未明确涵盖(仅隐式涵盖)。 您所指的特定功能(我认为)是以下功能的组合:
您可以使用语法
...
:
为对象中的其余项目创建变量和
您还可以为属性指定不同的名称:
手册没有给出两者使用的示例,如下所示。这种组合使用的有趣之处在于,
...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
底层语言规范中存在一个问题,旨在提高与解构相关的剩余元素使用的清晰度
other
之外的任何其他名称。例如:
const {...rest} = someVaribale;
const {...myname} = otherVariable;