Проблема

Реализовать тип Length, который принимает кортеж и возвращает длину этого кортежа. Например:

type tesla = ["tesla", "model 3", "model X", "model Y"];
type spaceX = [
  "FALCON 9",
  "FALCON HEAVY",
  "DRAGON",
  "STARSHIP",
  "HUMAN SPACEFLIGHT",
];

type teslaLength = Length<tesla>; // expected 4
type spaceXLength = Length<spaceX>; // expected 5

Решение

В этом случае, элементы кортежа предопределены, поэтому мы можем использовать свойство length, чтобы получить количество элементов в нём.

type Length<T extends any> = T["length"];

Но обращаясь к свойству length напрямую, мы получим ошибку компиляции “Type ‘length’ cannot be used to index type ‘T’.” Причина этой ошибки в том, что мы пытаемся взять свойство length из типа, который может быть чем угодно и не иметь этого свойства.

Чтобы решить эту проблему и помочь компилятору, нам нужно указать ограничения над T, а именно, указать что у типа T есть свойство length.

type Length<T extends { length: number }> = T["length"];

Что почитать