Definizione di array con più tipi in TypeScript


186

Ho un array nella forma: [ 1, "message" ].

Come lo definirei in TypeScript?


Domanda simile a questo, con nessuna risposta, ma questa volta usando l'ereditarietà delle classi con un numero imprecisato di elementi e tutti estendendo la stessa classe: stackoverflow.com/questions/50322488/...
cancerbero

Risposte:


313

Definizione di array con più tipi in TypeScript

Utilizzare una (string|number)[]demo del tipo di unione :

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

Ho una matrice del modulo: [1, "messaggio"].

Se sei sicuro che ci sono sempre solo due elementi [number, string], puoi dichiararlo come tupla:

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

2
Solo una nota che ciò richiederà TS v1.4 +
Brocco

6
... e non funzionerà con tipi complessi con proprietà diverse, quando si desidera accedere a una proprietà disponibile solo su uno dei tipi.
Nadine,

1
@Nadine E in quel caso, cosa si potrebbe fare?
msanford,

4
Ogni volta che sei chiaro su quale tipo sia, puoi fare un'asserzione di tipo. Quindi funzionerà per accedere alle proprietà.
Nadine,

78

Se lo stai trattando come una tupla (vedi sezione 3.3.3 delle specifiche della lingua ), allora:

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

o

interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];

10
SUGGERIMENTO: Preferireitype NumberStringTuple = [number, string]
basarat

1
Grazie! Ero assolutamente alla ricerca di questo:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
CoderPi

1
Nota: entrambi i tipi DEVONO essere nella matrice (non funziona anche per una matrice vuota). La risposta accettata è più versatile e che uso sempre personalmente, ma dipende dalle esigenze.
Druvis Cukurs,

27

La mia lanterna TS si lamentava di altre soluzioni, quindi la soluzione che funzionava per me era:

item: Array<Type1 | Type2>

se esiste un solo tipo, va bene usare:

item: Type1[]

Questo è fantastico, ma diciamo che se stiamo eseguendo il loop sull'array ora, come possiamo capire di che tipo è l'array corrente?
thouliha,



4

Sto usando questa versione:

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

È un po 'simile agli altri suggerimenti ma comunque facile e abbastanza buono da ricordare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.