TypeScript: creación de una matriz de contenedor escrita vacía
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?
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>();
Especificar explícitamente el tipo es la solución general cuando falla la inferencia de tipo para una declaración de variable.
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.
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.
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'
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!
Por favor prueba esto que funciona para mí.
return [] as Criminal[];