TypeScript: creación de una matriz de contenedor con tipo vacío

184

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 el formato del término de expresión".

También intenté hacer esto

var arr : Criminal = [];

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

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

darethas
fuente

Respuestas:

168

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 para cuando la inferencia de tipo falla para una declaración de variable.

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

  3. El uso del constructor Array es algo que solo lo ayudará en este caso de uso específico, pero que personalmente considero el 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 de 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, la diferencia de rendimiento era del 60% en Chrome, mientras que en Firefox no había una diferencia de rendimiento medible.

Thorarin
fuente
60% ?? : O Eso es salvaje
Max Coplan
239

El problema de preasignar correctamente una matriz tipada en TypeScript estaba algo oculto debido a la sintaxis literal de la matriz, por lo que no era 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'

Espero que esto ayude a otros!

darethas
fuente
20

Sé que esta es una vieja pregunta, pero recientemente enfrenté 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 el Criminal[]tipo

Ni return: Criminal[] [];tampocoreturn []: Criminal[]; trabajó para mí.

A primera vista Lo resuelto mediante la creación de una variable de tipo (como se informó correctamente) justo antes de devolverlo, pero (no sé cómo funcionan los motores de JavaScript) que puede crear sobrecarga y es menos legible.

Por rigor, también reportaré 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 los futuros lectores!

Fylax
fuente
1

Para uso público, use como a continuación:

public arr: Criminal[] = [];
rk13
fuente