22

Reading the changes in Typescript 4.0, I found the new feature:

Labeled Tuple Elements

I thought elements could either be indexed by numbers (like in tuples and lists) or by keys (like in dicts). I don't expected they could be indexed both ways.

my questions is:

  • Why/when should I use named tuples instead of normal tuples?
Bergi
  • 630,263
  • 148
  • 957
  • 1,375
zerocewl
  • 11,401
  • 6
  • 27
  • 53
  • 2
    They *can't* be "indexed both ways", the name labels are *metadata*. The actual value at runtime is still *just an array*, TS only exists at compile time. – jonrsharpe Aug 28 '20 at 07:31

1 Answers1

37

This is purely for documentation purposes, it has no semantics. They are just a way of putting names in the type signature--they type check identically to tuples without names, and the runtime behavior is identical as well.

While these have no impact on type-checking, the lack of labels on tuple positions can make them harder to use – harder to communicate our intent.

Emphasis added.

Use them whenever you want to document what the names of elements in a tuple are in the type signature of a function that uses them.

Example

You might have a Range type, which is [start, end]:

type Range = [start: number, end: number];

Or your Range type might be [start, length]:

type Range = [start: number, length: number];

Or you could use unnamed tuples:

type Range = [number, number];

These three definitions have identical semantics as far as TypeScript is concerned. You can access the members through destructuring by array access (e.g. arr[0]), just like any other array--they are not special. You cannot access the elements by name... again, these are just ordinary JavaScript array objects.

Dietrich Epp
  • 205,541
  • 37
  • 345
  • 415