Array <Typ> VS Typ [] in Typescript


161

Soweit ich weiß, kann der Typ einer Eigenschaft auf zwei Arten definiert werden, wenn es sich um ein Array handelt.

property_name: type

wo Typ kann entweder sein

Array<string>, Array<MyType>, etc. (e.g. let prop1: Array<string>)

und

string[], MyType[], etc. (e.g. let prop1: string[])

Was ist der Unterschied zwischen den beiden Fällen? Oder verstehe ich etwas falsch (vielleicht etwas über <>, das beim Casting verwendet wird?)

BEARBEITEN, da die Frage als doppelt markiert ist, ist mir bekannt, dass es die andere Frage zu jeder [] gibt, aber ich habe sie mir vor dem Posten noch angesehen und für mich ging es mehr um den Typ 'any' als um die verschiedenen [] VS < > Ich habe gefragt


3
Mögliches Duplikat von Typescript Array vs any []
Nitzan Tomer

1
Sie sind praktisch dieselben Konstrukte und zur Laufzeit praktisch dieselben Objekte. Reflect-Metadaten behandeln beide auch so, dass sie das ArrayObjekt als Konstruktor haben. Siehe die oben verlinkte Antwort.
John Weisz

3
@NitzanTomer diese Frage ist veraltet - Array<T>gab es damals noch nicht.
Nathan Shively-Sanders

@ NathanShively-Sanders ist die Antwort die gleiche mit oder ohne die Generika , weil diese Frage reduziert werden kann , um „was zwischen den anders let x: Array;zu let x: any[];
Nitzan Tomer

Antworten:


167

Es gibt keinen semantischen Unterschied

Es gibt überhaupt keinen Unterschied. Type[]ist die Kurzsyntax für ein Array von Type. Array<Type>ist die generische Syntax . Sie sind völlig gleichwertig.

Das Handbuch bietet hier ein Beispiel . Es ist gleichbedeutend mit schreiben:

function loggingIdentity<T>(arg: T[]): T[] {
    console.log(arg.length);
    return arg;
}

Oder:

function loggingIdentity<T>(arg: Array<T>): Array<T> {
    console.log(arg.length);
    return arg;
}

Und hier ist ein Zitat aus einigen Versionshinweisen :

Insbesondere number[]ist eine Kurzversion von Array<number>, genau wie Date[]eine Kurzform für Array<Date>.

Es gibt jedoch einen Fall, in dem die Kurzschrift-Syntax erforderlich ist

Seit TypeScript 3.4 gibt es einen Unterschied für den neuen readonlyTypmodifikator. Tatsächlich:

Der readonlyTypmodifikator kann nur für die Syntax von Array- und Tupeltypen verwendet werden

let err2: readonly Array<boolean>; // error!    
let okay: readonly boolean[]; // works fine

Die folgende Erklärung entspricht jedoch readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, Es ist ein generischer Typ. Lesen Sie einfach den Abschnitt "Hallo Welt der Generika" im Handbuch .
Paleo

4
Es gibt keine offizielle Empfehlung. Ich persönlich benutze die Kurzschrift und nur die Kurzschrift ( type[]), weil sie leichter zu lesen ist.
Paleo

2
Sie sind nicht völlig identisch mehr: typescriptlang.org/docs/handbook/release-notes/...
DShook

1
Wenn ich es richtig verstanden habe, readonlyfalls es nicht wirklich benötigt wird. Wenn Sie eine lange Notation bevorzugen, können Sie diese folgendermaßen schreiben:let err2: ReadonlyArray<boolean>;
n4nn31355

1
@ n4nn31355 Ich denke schon. Ich habe diesen Hinweis bearbeitet, um ihn hinzuzufügen.
Paleo

-10
foo: Array

bedeutet, dass es sich um ein einfaches Array mit einem impliziten anyTyp für seine Mitglieder handelt

foo: string[]

bedeutet, dass es sich um ein Array von Zeichenfolgen handelt, dh TypeScript wird mental, wenn Sie versuchen, etwas anderes als Zeichenfolgen in dieses Array zu verschieben.


10
Die Frage war Array <string> vs string [], nicht Array vs string [];
Juangui Jordán

Es ist seltsam, TypeScript scheint es nichts auszumachen, wenn ich ein Array von Zahlen an eine Methode mit einem Parameter übergebe, der wie foo: string[]
folgt

3
Wenn Sie ein Array von Zahlen übergeben, fn ([1,2,3]), macht es etwas aus. Wenn Sie eine Variable übergeben und der Typ nicht explizit ist, lassen Sie a = []; a = [1,2,3]; fn (a), dann macht es nichts aus, weil a Typ any ist []
Quentin 2
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.