Menu

TypeScript Array: Typen, Arrays von Objekten, map und filter

Arrays in TypeScript typisieren: T[] vs Array<T>, Arrays von Objekten, Arrays mit mehreren Typen, readonly Arrays und was map, filter, reduce und find zurückgeben. Dazu die includes-Falle bei Literal-Arrays.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Ein Array-Typ in TypeScript ist der Elementtyp gefolgt von []: string[] ist ein Array von Strings, number[] ein Array von Zahlen. Die generische Schreibweise Array<string> ist derselbe Typ. Sobald ein Array typisiert ist, hat jedes Element, das du hinzufügst oder ausliest, diesen Typ.

Die Zeile mit @ts-expect-error ist ein Compilerfehler (TS2345). Hier ist er als erwartet markiert, damit der Block trotzdem läuft, und da Typen entfernt werden, wird die 42 zur Laufzeit wirklich eingefügt: Die Ausgabe zeigt sie.

string[] vs Array<string>

Geschrieben alsGleich wieHinweise
string[]Array<string>Die übliche Schreibweise.
(string | number)[]Array<string | number>Die Klammern sind nötig: string | number[] bedeutet „ein String oder ein Array von Zahlen“.
readonly string[]ReadonlyArray<string>Kein push, pop, sort und keine Zuweisung per Index.
User[]Array<User>Arrays von Objekten nutzen den Typ des Objekts.
string[][]Array<Array<string>>Ein 2D-Array (Raster).

Entscheide dich in einer Codebasis für einen Stil. Die Regel array-type von typescript-eslint verwendet standardmäßig T[].

Arrays von Objekten

Beschreibe das Element mit einem Typalias oder Interface und nutze dann Type[]. Alles, was aus dem Array gelesen wird, wird gegen diese Form geprüft.

Ein Objektliteral, das in users eingefügt wird, muss genau zu User passen: Ein fehlendes admin oder eine falsch geschriebene Eigenschaft ist ein Compilerfehler.

Typisiertes map, filter, reduce und find

Die Array-Methoden sind generisch, daher tragen ihre Ergebnisse Typen. Was jede Methode zur Laufzeit tut, steht auf der JavaScript-Seite zu Array-Methoden; die Typen sind das, was TypeScript hinzufügt:

MethodeErgebnistyp auf T[]
map(fn)U[], wobei U das ist, was fn zurückgibt
filter(fn)T[] (oder ein engerer Typ, siehe unten)
find(fn)T | undefined
findIndex(fn), indexOf(x)number (-1, falls nicht vorhanden)
some(fn), every(fn), includes(x)boolean
reduce(fn, init)der Typ von init (oder das Typargument, reduce<R>(...))
at(i)T | undefined
join(sep)string

Das letzte Beispiel funktioniert, weil TypeScript (seit 5.5) erkennt, dass (n) => n !== undefined ein Type Predicate ist, sodass filter number[] statt (number | undefined)[] zurückgibt. Für Prüfungen, die es nicht ableiten kann, schreibst du das Predicate selbst: filter((x): x is User => x !== null).

Arrays mit mehr als einem Typ

Ein Union-Elementtyp erlaubt eine Mischung. Eine Union von Array-Typen nicht:

Haben Positionen feste Typen, etwa ein Paar [name, age], nimm stattdessen ein Tupel: [string, number] weiß, dass Index 0 ein String und Index 1 eine Zahl ist, (string | number)[] weiß das nicht.

Readonly Arrays

readonly T[] entfernt jede Methode, die das Array verändert. Nutze es für Parameter, die eine Funktion nicht ändern soll, und für Konstanten.

index.ts(3,12): error TS2339: Property 'push' does not exist on type 'readonly number[]'.

Lösche die Zeile mit push, und der Block gibt 4 aus. Ein veränderbares number[] kann immer dort übergeben werden, wo readonly number[] erwartet wird, readonly Parameter kosten Aufrufer also nichts. Die Prüfung gilt nur beim Kompilieren: Zur Laufzeit ist es ein gewöhnliches Array. Um ein readonly Array zu sortieren, sortierst du eine Kopie: [...values].sort().

Die includes-Falle bei Literal-Arrays

as const macht aus einem Array ein readonly Tupel aus Literaltypen. Das ist nützlich für eine Liste erlaubter Werte, aber includes akzeptiert dann nur diese Literale:

Steckt die Prüfung in einem Type Guard (value is Color), passiert die Erweiterung nur einmal, und Aufrufer bekommen einen eingeengten Wert zurück.

Indexzugriff und leere Arrays

arr[i] zu lesen ergibt den Typ T, selbst wenn i außerhalb des Bereichs liegt und der Wert zur Laufzeit undefined ist. at(i) ist als T | undefined typisiert, und die Compileroption noUncheckedIndexedAccess lässt auch den einfachen Indexzugriff T | undefined zurückgeben.

queue[0].toUpperCase() würde kompilieren und dann zur Laufzeit einen TypeError werfen. Nimm at(), eine Längenprüfung oder noUncheckedIndexedAccess, wenn ein Index fehlen kann.

Häufig gestellte Fragen

Wie deklariert man einen Array-Typ in TypeScript?

Schreibe den Elementtyp gefolgt von []: let names: string[] = ["a", "b"]. Die generische Form Array<string> bedeutet genau dasselbe. Für ein Array von Objekten nimmst du einen Objekttyp oder ein Interface als Elementtyp: User[].

Was ist der Unterschied zwischen string[] und Array<string>?

Keiner: Es sind zwei Schreibweisen desselben Typs. string[] ist verbreiteter. Die generische Form liest sich bei komplexen Elementtypen besser, und bei readonly Arrays sind readonly string[] und ReadonlyArray<string> ebenfalls identisch.

Warum gibt find in TypeScript undefined zurück?

array.find() gibt T | undefined zurück, weil eventuell nichts passt. Unter strict musst du den Fall undefined behandeln, mit einer if-Prüfung, Optional Chaining (found?.name) oder einem Standardwert (found ?? fallback), bevor du das Ergebnis verwendest.

Wie typisiere ich in TypeScript ein Array mit mehreren Typen?

Nimm einen Union-Elementtyp in Klammern: (string | number)[] ist ein Array, in dem jedes Element ein String oder eine Zahl ist. Das unterscheidet sich von string[] | number[], also entweder einem Array nur aus Strings oder einem nur aus Zahlen. Für eine feste Reihenfolge von Typen wie [string, number] nimmst du ein Tupel.

Warum meldet includes einen Fehler bei einem Array mit as const?

Ein readonly Array aus Literalen wie ["red", "green"] as const hat includes(searchElement: "red" | "green"), einen einfachen string zu übergeben ist also der Fehler TS2345. Erweitere das Array für die Prüfung, (COLORS as readonly string[]).includes(input), am besten in einem Type Guard, der input auf die Literal-Union einengt.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S