Búsqueda de sitios web

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.

Artículos relacionados