Definición de matriz con múltiples tipos en TypeScript

185

Tengo una matriz de la forma: [ 1, "message" ].

¿Cómo definiría esto en TypeScript?

dk123
fuente
Pregunta similar a esta, sin respuesta, pero esta vez usando herencia de clase con un número desconocido de elementos y todos extendiendo la misma clase: stackoverflow.com/questions/50322488/…
cancerbero

Respuestas:

313

Definición de matriz con múltiples tipos en TypeScript

Use una (string|number)[]demostración tipo unión :

const foo: (string|number)[] = [ 1, "message" ];

Tengo una matriz de la forma: [1, "mensaje"].

Si está seguro de que siempre hay solo dos elementos [number, string], puede declararlo como una tupla:

const foo: [number, string] = [ 1, "message" ];
basarat
fuente
2
Solo una nota de que esto requerirá TS v1.4 +
Brocco
66
... y no funcionará con tipos complejos con diferentes propiedades, cuando desee acceder a una propiedad disponible solo en uno de los tipos.
Nadine
1
@ Nadine Y en ese caso, ¿qué se puede hacer?
msanford
44
Cada vez que tenga claro qué tipo es, puede hacer una aserción de tipo. Entonces funcionará para acceder a las propiedades.
Nadine
78

Si lo está tratando como una tupla (consulte la sección 3.3.3 de las especificaciones del lenguaje ), entonces:

var t:[number, string] = [1, "message"]

o

interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];
curpa
fuente
10
CONSEJO: Preferiríatype NumberStringTuple = [number, string]
basarat
1
¡Gracias! Estaba totalmente buscando esto:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
CoderPi
1
Nota: ambos tipos DEBEN estar en la matriz (tampoco funciona para una matriz vacía). La respuesta aceptada es más versátil y personalmente la uso siempre, pero depende de las necesidades.
Druvis Cukurs
27

Mi pelusa TS se quejaba de otras soluciones, por lo que la solución que me funcionaba era:

item: Array<Type1 | Type2>

si solo hay un tipo, está bien usarlo:

item: Type1[]
Szamanm
fuente
Esto es genial, pero digamos que si estamos recorriendo la matriz ahora, ¿cómo podemos determinar de qué tipo es la matriz actual?
thouliha
4

Estoy usando esta versión:

exampleArr: Array<{ id: number, msg: string}> = [
   { id: 1, msg: 'message'},
   { id: 2, msg: 'message2'}
 ]

Es un poco similar a las otras sugerencias, pero aún así es fácil y bastante bueno para recordar.

DerKarim
fuente