У меня есть это объявление:
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 };
Оба работают нормально. Может ли кто-нибудь объяснить мне, почему это так?