什么是 Typescript 中的“命名或标记元组”?

zer*_*ewl 4 tuples typescript

阅读Typescript 4.0 中的变化,我发现了新功能:

带标签的元组元素

我认为元素可以由数字(如元组和列表)或键(如字典)索引。我不希望它们可以双向索引。

我的问题是:

  • 为什么/何时应该使用命名元组而不是普通元组?

Die*_*Epp 12

这纯粹是出于文档目的,它没有语义。它们只是在类型签名中放置名称的一种方式——它们对没有名称的元组进行类型检查,并且运行时行为也相同。

虽然这些对类型检查没有影响,但元组位置上缺少标签会使它们更难使用——更难传达我们的意图。

加了重点。

每当您想记录元组中元素的名称在使用它们的函数的类型签名中的名称时,请使用它们。

例子

您可能有一种Range类型,即[start, end]

type Range = [start: number, end: number];
Run Code Online (Sandbox Code Playgroud)

或者您的Range类型可能是[start, length]

type Range = [start: number, length: number];
Run Code Online (Sandbox Code Playgroud)

或者您可以使用未命名的元组:

type Range = [number, number];
Run Code Online (Sandbox Code Playgroud)

就 TypeScript 而言,这三个定义具有相同的语义。您可以通过数组访问(例如arr[0])通过解构访问成员,就像任何其他数组一样——它们并不特殊。您不能按名称访问元素……同样,这些只是普通的 JavaScript 数组对象。

  • @sayandcode:您无法访问该名称。 (3认同)
  • 不过,如果您传播它们,它们确实会对类型检查产生_一些_影响。使用“[x?: number]”作为函数的参数将使第一个参数可选,而使用“[number |” 未定义]`不会。 (2认同)
  • @m93a,你必须使用正确的语法。如果您想要未标记元组中的可选条目,请执行“[number?]”。 (2认同)