Array mit mehreren Typen in TypeScript definieren


184

Ich habe ein Array der Form : [ 1, "message" ].

Wie würde ich das in TypeScript definieren?


Ähnliche Frage wie diese, ohne Antwort, aber diesmal unter Verwendung der Klassenvererbung mit unbekannter Anzahl von Elementen und alle, die dieselbe Klasse erweitern: stackoverflow.com/questions/50322488/…
cancerbero

Antworten:


312

Array mit mehreren Typen in TypeScript definieren

Verwenden Sie eine (string|number)[]Demo vom Typ Union :

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

Ich habe ein Array der Form: [1, "Nachricht"].

Wenn Sie sicher sind, dass es immer nur zwei Elemente [number, string]gibt, können Sie es als Tupel deklarieren:

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

2
Nur eine Anmerkung, dass dies TS v1.4 +
Brocco

6
... und es funktioniert nicht mit komplexen Typen mit unterschiedlichen Eigenschaften, wenn Sie auf eine Eigenschaft zugreifen möchten, die nur für einen der Typen verfügbar ist.
Nadine

1
@ Nadine Und was könnte man dann tun?
Msanford

4
Jedes Mal, wenn Sie sich darüber im Klaren sind, um welchen Typ es sich handelt, können Sie eine Typzusicherung durchführen. Dann funktioniert es, auf die Eigenschaften zuzugreifen.
Nadine

78

Wenn Sie es als Tupel behandeln (siehe Abschnitt 3.3.3 der Sprachspezifikation ), dann:

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

oder

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

10
TIPP: Ich würde es vorziehentype NumberStringTuple = [number, string]
Basarat

1
Vielen Dank! Ich war total auf der Suche nach:const W3COLORS: [[string, string, number, number]] = [ ["aliceblue", "#f0f8ff", 240, 248, 255], ... ];
CoderPi

1
Hinweis - Beide Typen MÜSSEN sich im Array befinden (funktioniert auch nicht für ein leeres Array). Akzeptierte Antworten sind vielseitiger und werden von mir persönlich immer verwendet, hängen jedoch von den Anforderungen ab.
Druvis Cukurs

27

Mein TS-Flusen beschwerte sich über andere Lösungen, daher war die Lösung, die für mich funktionierte, Folgendes:

item: Array<Type1 | Type2>

Wenn es nur einen Typ gibt, ist es in Ordnung zu verwenden:

item: Type1[]

Das ist großartig, aber sagen wir, wenn wir jetzt das Array durchlaufen, wie können wir dann herausfinden, welcher Typ das aktuelle Array ist?
Thouliha



4

Ich benutze diese Version:

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

Es ist ein bisschen ähnlich wie die anderen Vorschläge, aber immer noch einfach und gut zu merken.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.