Array <Type> VS Type [] w Typescript


162

O ile wiem, typ właściwości można zdefiniować na dwa sposoby, jeśli jest to Array.

property_name: type

gdzie typem może być

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

i

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

Jaka jest różnica między tymi dwoma przypadkami? A może coś źle rozumiem (może coś o <> używanym w castingu?)

EDYTUJ, ponieważ pytanie jest oznaczone jako zduplikowane, zdaję sobie sprawę, że istnieje inne pytanie dotyczące dowolnego [], ale mimo to spojrzałem na nie przed wysłaniem i dla mnie dotyczyło to bardziej typu „dowolny” niż innego [] VS < > Zapytałem



1
Są to praktycznie te same konstrukcje i faktycznie są tymi samymi obiektami w czasie wykonywania. Reflect-metadata również potraktuje je jako mające Arrayobiekt jako konstruktor. Zobacz powyższą połączoną odpowiedź.
John Weisz

3
@NitzanTomer To pytanie jest nieaktualne - Array<T>wtedy nie istniało.
Nathan Shively-Sanders

@ NathanShively-Sanders odpowiedź jest taka sama, z lub bez leków generycznych, ponieważ kwestia ta może zostać obniżona do „co jest odmienne od let x: Array;do let x: any[];
Nitzan Tomer

Odpowiedzi:


168

Nie ma żadnej różnicy semantycznej

Nie ma żadnej różnicy. Type[]to skrócona składnia tablicy Type. Array<Type>jest składnią ogólną . Są całkowicie równoważne.

Podręcznik zawiera przykład . Odpowiada napisaniu:

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

Lub:

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

A oto cytat z niektórych informacji o wydaniu :

W szczególności number[]jest skróconą wersją Array<number>, tak samo jak Date[]skrótem dla Array<Date>.

Istnieje jednak przypadek, w którym wymagana jest skrócona składnia

Od wersji TypeScript 3.4 istnieje różnica w nowym readonlymodyfikatorze typu. W rzeczy samej:

readonlymodyfikator typu może być stosowany tylko do składnię typów i rodzajów tablic krotki

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

Jednak następująca deklaracja jest równoważna z readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, jest to typ ogólny. Po prostu przeczytaj sekcję „Witaj świecie leków generycznych” w podręczniku .
Paleo

4
Nie ma oficjalnej rekomendacji. Osobiście używam skrótu i ​​tylko skrótu ( type[]), ponieważ jest łatwiejszy do odczytania.
Paleo

2
Oni nie są całkowicie identyczne już: typescriptlang.org/docs/handbook/release-notes/...
DShook

1
Jeśli dobrze to zrobiłem, na readonlywypadek, gdyby nie było to wymagane. Jeśli wolisz długą notację, możesz napisać ją w ten sposób:let err2: ReadonlyArray<boolean>;
n4nn31355

1
@ n4nn31355 Myślę, że tak. Edytowałem, aby dodać to powiadomienie.
Paleo

-10
foo: Array

oznacza, że ​​jest to zwykła tablica z niejawnym anytypem dla jej elementów członkowskich

foo: string[]

oznacza, że ​​jest to tablica ciągów, tj. TypeScript przejdzie w stan mentalny, jeśli spróbujesz wepchnąć cokolwiek innego niż ciągi do tej tablicy.


10
Pytanie brzmiało: Array <string> vs string [], a nie Array vs string [];
Juangui Jordán

To dziwne, TypeScript nie wydaje się mieć nic przeciwko, kiedy przekazuję tablicę liczb do metody z parametrem zdefiniowanym jakofoo: string[]
jlewkovich

3
Jeśli przekazujesz tablicę liczb, fn ([1,2,3]), to nie przeszkadza. Jeśli przekazujesz zmienną, a typ nie jest jawny, niech a = []; a = [1, 2, 3]; fn (a), to nie ma nic przeciwko, ponieważ a jest typu any []
Quentin 2
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.