TypeScript: creación de una matriz de contenedor escrita vacía

Resuelto darethas asked hace 11 años • 7 respuestas

Estoy creando un juego de lógica simple llamado "Tres de un crimen" en TypeScript.

Al intentar preasignar una matriz escrita en TypeScript, intenté hacer algo como esto:

var arr = Criminal[];

que dio el error "Verificar formato del término de expresión".

También intenté hacer esto

var arr : Criminal = [];

y esto produjo "no se puede convertir ningún [] a 'Criminal'

¿Cuál es la forma 'TypeScript' de hacer esto?

darethas avatar Apr 05 '13 12:04 darethas
Aceptado

Las respuestas existentes omitieron una opción, así que aquí hay una lista completa:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Especificar explícitamente el tipo es la solución general cuando falla la inferencia de tipo para una declaración de variable.

  2. La ventaja de usar una aserción de tipo (a veces llamada conversión, pero en realidad no es una conversión en TypeScript) funciona para cualquier expresión, por lo que se puede usar incluso cuando no se declara ninguna variable. Hay dos sintaxis para afirmaciones de tipo, pero solo la última funcionará en combinación con JSX si eso te importa.

  3. Usar el constructor Array es algo que sólo te ayudará en este caso de uso específico, pero que personalmente encuentro más legible. Sin embargo, hay un ligero impacto en el rendimiento en tiempo de ejecución*. Además, si alguien estuviera lo suficientemente loco como para redefinir el constructor Array, el significado podría cambiar .

Es una cuestión de preferencia personal, pero creo que la tercera opción es la más legible. En la gran mayoría de los casos, los inconvenientes mencionados serían insignificantes y la legibilidad es el factor más importante.

*: Hecho de la diversión; Al momento de escribir este artículo, la diferencia de rendimiento era del 60 % en Chrome, mientras que en Firefox no había una diferencia de rendimiento mensurable.

Thorarin avatar Apr 05 '2017 12:04 Thorarin

La cuestión de preasignar correctamente una matriz escrita en TypeScript quedó algo oscurecida debido a la sintaxis literal de la matriz, por lo que no fue tan intuitivo como pensé al principio.

La forma correcta sería

var arr : Criminal[] = [];

Esto le dará una matriz vacía escrita correctamente almacenada en la variable 'arr'

darethas avatar Apr 05 '2013 05:04 darethas

Sé que esta es una vieja pregunta, pero recientemente me enfrenté a un problema similar que no se pudo resolver de esta manera, ya que tuve que devolver una matriz vacía de un tipo específico.

Yo tenía

return [];

donde []estaba Criminal[]el tipo.

Ninguno return: Criminal[] [];de los dos return []: Criminal[];funcionó para mí.

A primera vista, lo resolví creando una variable escrita (como usted informó correctamente) justo antes de devolverla, pero (no sé cómo funcionan los motores de JavaScript) puede generar una sobrecarga y es menos legible.

Para mayor detalle, también informaré esta solución en mi respuesta:

let temp: Criminal[] = [];
return temp;

Finalmente encontré la conversión de tipos de TypeScript, lo que me permitió resolver el problema de una manera más concisa y legible (y tal vez eficiente):

return <Criminal[]>[];

¡Espero que esto ayude a futuros lectores!

Fylax avatar Aug 09 '2016 08:08 Fylax

Por favor prueba esto que funciona para mí.

return [] as Criminal[];
Zhihong LU avatar Jan 26 '2021 22:01 Zhihong LU