In TypeScript können Sie Arrays definieren, die mehrere Datentypen enthalten, indem Sie Union Types verwenden. Ein Union Type ist ein Typ, der einen von mehreren möglichen Typen darstellen kann. Sie definieren Union Types, indem Sie die möglichen Typen mit einem vertikalen Balken (|) auflisten.
Zum Beispiel kann ein Array, das sowohl Zahlen als auch Strings enthält, wie folgt definiert werden:
let arr: (number | string)[] = [1, 'a', 2, 'b', 3, 'c'];In diesem Beispiel kann arr sowohl Zahlen als auch
Strings enthalten. Ein Versuch, einen Wert eines anderen Typs
hinzuzufügen, führt zu einem TypeScript-Fehler:
arr.push(true); // Fehler: 'boolean' kann nicht dem Typ 'string | number' zugewiesen werden.Beim Arbeiten mit Union Types in Arrays ist es oft notwendig, Type Guards zu verwenden, um den Typ eines Elements zur Laufzeit zu überprüfen. Dies stellt sicher, dass Sie auf die spezifischen Eigenschaften jedes Typs sicher zugreifen können:
arr.forEach((element) => {
if (typeof element === 'string') {
console.log(`String: ${element.toUpperCase()}`);
} else {
console.log(`Number: ${element.toFixed(2)}`);
}
});Union Types können auch komplexe Typen umfassen, wie Interfaces oder Typ-Aliase, was Ihnen ermöglicht, noch flexiblere und leistungsfähigere Datentypen zu erstellen:
type StringOrNumber = string | number;
let mixedArray: StringOrNumber[] = [1, 'two', 3];In realen Projekten werden Arrays mit Union Types häufig verwendet, um heterogene Datenstrukturen zu verarbeiten, wie z.B. eine Kombination aus verschiedenen Entitätstypen oder verschiedenen Antwortformaten von einer API.
Eine Herausforderung bei der Verwendung von Arrays mit Union Types ist, dass Sie möglicherweise häufig Type Guards verwenden müssen, um Typsicherheit zu gewährleisten. Dies kann den Code komplexer machen und erfordert ein sorgfältiges Design.
TypeScript bietet Typinferenz, die auch bei der Verwendung von
Array-Methoden wie .map(), .filter() und
.reduce() mit Union Types funktioniert:
let filteredNumbers = arr.filter((element): element is number => typeof element === 'number');In diesem Beispiel filtert filteredNumbers alle Zahlen
aus dem ursprünglichen Array heraus, indem es einen Type Guard innerhalb
der .filter()-Methode verwendet.