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

2023-12-28

EDIT:

我在github上开了一个与此相关的问题:https://github.com/Microsoft/TypeScript/issues/21265 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;

我知道它有效,我已经测试过了(在线测试 https://www.typescriptlang.org/play/#src=const%20values%20%3D%20%7B%20a%3A%20%221%22%2C%20b%3A%20%222%22%2C%20c%3A%20%223%22%2C%20d%3A%20%224%22%20%7D%3B%0D%0A%0D%0Aconst%20%7B%20a%3A%20va%2C%20b%3A%20vb%2C%20...vother%20%7D%20%3D%20values%3B%0D%0A%0D%0Aconsole.log(va%2C%20vb%2C%20vother)%3B%0D%0A%0D%0Aconsole.log(%22----%22)%3B%0D%0A%0D%0Aconst%20%7B%20a%3A%20xa%2C%20b%3A%20xb%2C%20...other%3A%20xother%20%7D%20%3D%20values%3B%0D%0A%0D%0Aconsole.log(xa%2C%20xb%2C%20xother)%3B%0D%0A)。但我无法找到它的定义位置。

涉及属性重命名的文档示例始终显示“正常”情况:TypeScript 手册 - 变量声明 https://www.typescriptlang.org/docs/handbook/variable-declarations.html。规范语法指的是BindingPattern规范中没有描述(或者我错过了):TypeScript 规范 https://github.com/Microsoft/TypeScript/blob/master/doc/TypeScript%20Language%20Specification.pdf.

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


您提到的手册链接涵盖了示例中的大多数场景解构 https://www.typescriptlang.org/docs/handbook/variable-declarations.html#object-destructuring,但我认为它涵盖的一种情况没有明确涵盖(只是隐含地)。

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

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

and

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

手册没有给出两者都使用的示例,如下所示。这种组合使用的有趣之处在于...othertoken 实际上并不意味着任何东西,并且永远不会被引用(或可引用)。在下面示例的“工作”版本中,如果没有错误行,则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

有一个提高与解构相关的剩余元素的使用清晰度的问题 https://github.com/Microsoft/TypeScript/issues/2713在底层语言规范中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 TypeScript 中解构对象时重命名剩余属性变量 的相关文章

随机推荐

  • Nuxt部署错误:服务器资源不可用

    为了在 ssr 模式下部署我们的 nuxt 网站 我们首先在 bitbucket 管道中构建和单元测试网站 如果测试成功 我们将构建文件从 bitbucket 服务器复制到我们的生产服务器并触发启动 问题是 Nuxt 文档没有说明服务器上需
  • 与同时使用 minmax_element 相比 min_element 和 max_element 是否有任何效率优势?

    std minmax element 返回一个对 其中包含一个到最小元素的迭代器作为第一个元素 一个到最大元素的迭代器作为第二个元素 std min element 返回一个迭代器到范围 first last 中的最小元素 std max
  • 如何向我的 Linq 选择添加唯一的行号?

    我有以下代码 public IEnumerable
  • Django 1.5:访问 models.py 中的自定义用户模型字段

    我正在开发 Django 1 5 项目 我有一个自定义用户模型 我们称之为CustomUser 另一个应用程序 SomeApp 需要引用此自定义用户模型 为了ForeignKey等的目的 Django文档说使用 User settings
  • 连接两个字符数组?

    如果我有两个像这样的字符数组 char one 200 char two 200 然后我想做第三个连接这些的我该怎么做呢 我努力了 char three 400 strcpy three one strcat three two 但这似乎不
  • 使用 MultipartEntity 构造 POST 请求

    我想构造一个多部分请求 具有以下参数 名称 字符串 电子邮件 字符串 和文件上传 文件 我正在使用下面的 Java 代码 在 Android 中工作 httppost getRequestLine 打印 POST http www myur
  • Shell 重定向与显式文件处理代码

    我的母语不是英语 所以请原谅这个问题的尴尬标题 我只是不知道如何更好地表达它 我在 FreeBSD 机器上 我有一个用以下语言编写的小过滤工具C它通过读取数据列表stdin并通过输出处理后的列表stdout 我像这样调用它 find typ
  • 为什么微调器中的 onNothingSelected 没有被调用?

    我有一个 Android Spinner 当用户在显示 Spinner 的选择面板时按 后退键 时 我想监听该事件 我已经实现了 OnItemSelectedListener 但按后退键时未调用 onNothingSelected Adap
  • Django 的 mod_wsgi 错误:从守护进程读取响应标头时超时

    我正在运行 Django 2 0 4 和 mod wsgi 4 5 20 当我尝试将站点部署到我们的开发环境时 出现错误 parature 奇怪的是 该站点部署在根目录下VirtualHost正在正常响应 Tue Apr 10 13 34
  • 如何在字段级别创建元注释?

    我有这个带注释的休眠类 Entity public class SimponsFamily Id TableGenerator name ENTITY ID GENERATOR table ENTITY ID GENERATOR TABLE
  • Python有效地找到多个多项式的局部最大值/最小值

    我正在寻找一种有效的方法来查找多个 gt 100万 但独立的四阶多项式的局部最小值给定 指定范围 边界 我有两个要求 R1 即使对于 100 万个不同的多项式方程也有效 R2 局部最小值精确到 0 01 即 2dp 这是我使用创建的一些代码
  • 按计划手动触发 GitHub 操作

    我想按计划手动触发 GitHub 操作 但出现以下代码并出现错误 name Update data on workflow dispatch schedule cron 0 5 30 我正在寻找如何正确执行此操作的解决方案 并且有两种选择
  • 我将如何实现一种简单的基于堆栈的编程语言

    我有兴趣通过实现基于堆栈的编程语言来扩展我的计算机编程知识 我正在寻求从哪里开始的建议 因为我打算让它具有类似 pushint 1 会将值为 1 的整数推送到堆栈顶部 并通过诸如 之类的标签进行流量控制L01 jump L01 到目前为止
  • 我的回收者视图上的问题

    我正在尝试显示 recyclerview 并从 firebase 检索数据 但在添加保存在 firebase 存储上的图像后遇到问题 滚动后关闭 我有另一个 recyclerview 它使用相同的数据库 但没有问题 你能给我解决这个问题吗
  • eclipse插件开发

    我想开发一个eclipse插件 哪一个是最好的开始方式 本教程 http www vogella de articles EclipsePlugIn article html是一个很好的起点 然后 您可以通过阅读一本最新的 Eclipse
  • 如何将 Shell 脚本中的部分字符串提取到变量中

    我正在尝试在 sh 中执行以下操作 这是我的文件 foo bar Tests run 729 Failures 0 Errors 253 Skipped 0 baz 如何将 4 个数字拉入 4 个不同的变量 我现在已经在 sed 和 awk
  • C# 用户定义的 CSV 映射到 POCO

    我有一个从串行 UDP TCP 源读取输入数据的系统 输入数据只是不同数据类型 例如 DateTime double int string 的 CSV 示例字符串可能是 2012 03 23 12 00 00 1 000 23 inform
  • 是否可以告诉自动映射器在运行时忽略映射?

    我正在使用 Entity Framework 6 和 Automapper 将实体映射到 dtos 我有这个型号 public class PersonDto public int Id get set public string Name
  • MathJax 方程换行

    嘿 如果包含的元素具有固定大小 有谁知道让 MathJax 自动换行方程的好方法 MathJax v2 0 现在包括针对长显示方程的自动 可选 换行 它是由linebreaks的部分HTML CSS您的配置块 请参阅MathJax 文档 h
  • 在 TypeScript 中解构对象时重命名剩余属性变量

    EDIT 我在github上开了一个与此相关的问题 https github com Microsoft TypeScript issues 21265 https github com Microsoft TypeScript issue