typescript - ¿Por qué es necesario extender {0:T} para hacer cumplir la longitud de un array genérico?
Vi este tuit que mostraba un fragmento de código sobre cómo hacer cumplir la longitud de un array genérico en TypeScript. El fragmento de código se reproduce a continuación:
type MyArray<T, Length extends number> = Array<T> & { length: Length }
El único problema es que no funciona. Como se puede ver en este enlace del playground
Falla con el siguiente error:
Type 'string[]' is not assignable to type 'MyArray<string, 3>'.
Type 'string[]' is not assignable to type '{ length: 3; }'.
Types of property 'length' are incompatible.
Type 'number' is not assignable to type '3'.(2322)
Más adelante en el hilo de Twitter, se propuso una solución que en realidad funcionó.
Esto se reproduce a continuación:
type MyArray<T extends any, L extends number> = Array<T> & {
0: T;
length: L;
}
const foo1: MyArray<number, 5> = [1, 2, 3, 4, 5];
Y se puede ver en este enlace del patio de recreo
La pregunta es, ¿qué diferencia hace {0: T}? ¿Y por qué es que al extenderlo hace que el código funcione?
Respuesta #1
El tipo que estás usando, string[], tiene que ser compatible tanto con los tipos Array como con { length: Length }. Creo que agregar { 0: T } hace que el tipo sea compatible con Array.