Необходимо использовать дополнительные элементы для объявления типа, чтобы избежать ошибки. Не могу понять почему - PullRequest
0 голосов
/ 30 марта 2020

У меня есть это объявление:

type ArrayOfLength<L extends number, T = any> = T[] & { length: L };

Если я пытаюсь использовать тип, это приводит к ошибке:

let a: ArrayOfLength<5> = [3, 4, 5, 6, 7];
// Type 'number[]' is not assignable to type 'ArrayOfLength<5, any>'.
  // Type 'number[]' is not assignable to type '{ length: 5; }'.
    // Types of property 'length' are incompatible.
      // Type 'number' is not assignable to type '5'.ts(2322)

Чтобы избежать этой ошибки, я нашел два подхода.

1)

type ArrayOfLength<L extends number, T = any> = T[] & { 0: T; length: L };

2)

type ArrayOfLength<L extends number, T = any> = [T, ...T[]] & { length: L };

Оба работают нормально. Может ли кто-нибудь объяснить мне, почему это так?

...