【问题标题】:using spread operator in typescript在打字稿中使用扩展运算符
【发布时间】:2018-07-25 01:51:13
【问题描述】:

我想编写一个函数,它返回一个包裹在另一个组件中的组件。我正在尝试编写的函数如下所示。

function GetGroup({ name, text, isRequired, ...props }) 

这里,nametextisRequired 是从传递的参数中获取的,其他的则作为 props 发送到另一个组件。

如何用 TypeScript 编写?

【问题讨论】:

  • 您的编写方式与 JavaScript 完全相同。如果需要,您可以选择为整个对象提供类型注释。所有类型注释都是可选的。
  • 我投了反对票,因为你没有尝试。如果你有谷歌,你会在打字稿网站上找到答案,这将是第一个结果。
  • @AluanHaddad 老实说我不知道​​要搜索什么。我尝试制作一个界面并将其用作类型,但没有成功。
  • @Prajwal 我为我的草率道歉。我做了一个无效的假设,即简单地用您的问题标题搜索 Google 或 Bing 会很快找到相应的文档。不幸的是,它没有。我会添加一个答案。我还冒昧地编辑了标签,因为它在开始和使用时与 React 相关,它通常适用于 JavaScript 和 TypeScript,并且非常有用。

标签: javascript typescript ecmascript-next


【解决方案1】:
function GetGroup({ name, text, isRequired, ...props }: { name: string; text: string; isRequired: boolean; other: number; arg: string }) {
  props.other // number
  props.arg // string
}

TypeScript 只是添加类型。nametextisRequired 是普通参数。另一方面,props 是其余的论点。因此,无论剩余的参数如何,都假定为声明的其余类型。

【讨论】:

  • 添加了更多信息,@aloisdg
【解决方案2】:

首先,Object Rest/Spread 是一个提议的 ECMAScript 功能,它正在走向标准化,已经达到第 4 阶段,and is in the process of being formally adopted

正如您从它的用法中知道的那样,它使得使用纯 JavaScript 对象变得异常灵活。

TypeScript 2.1 文档中提供了有关该功能类型的信息。正如它非常雄辩地指出:

对象休息是对象扩展的对偶,因为它们可以提取在解构元素时不会被拾取的任何额外属性:

确实有两个功能在发挥作用,一个是互补的。

对象休息

当使用该特性的 Rest 部分时,它通过使我们能够将其余属性收集到由它们组成的新对象中来增强对象解构。

我们可以像编写任何其他值一样编写类型注释。例如

interface GroupProperties {
  name: string;
  text: string;
  isRequired?: boolean;
  values: string[];
  flagged: boolean;
}

function Group({ name, text, isRequired, ...rest }: GroupProperties) {
  console.log(rest);
}

这会通知类型系统nametext 属于string 类型,而is required 属于boolean 类型。 然后类型系统进一步知道rest 有两个属性,valuesflagged 分别属于booleanstring 类型。推导出rest的类型。

对象传播

当使用该特性的 Spread 部分时,它通过支持从多个来源声明式构造对象、轻松创建派生以及轻松取消定义和覆盖来增强对象构造。

类型系统还理解 Spread 表达式的含义并推断出它们求值的类型。

const o = {x: 1, y: 'hello'};

const o1 = {
  ...o,
  y: 1
};

在上面,o1 的类型为{x: number, y: number}

【讨论】:

  • 函数定义中也可以写类型:function Group({ name, text, ...}: {name: string, text: string, ...})
  • @BallpointBen,确实如此,但我发现它很快变得不可读,因为属性的数量超过了三个
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2019-09-26
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 2021-06-18
相关资源
最近更新 更多