Array <Type> VS Type [] dans Typescript


162

Pour autant que je sache, le type d'une propriété peut être défini de deux manières lorsqu'il s'agit d'un tableau.

property_name: type

où le type peut être soit

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

et

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

Quelle est la différence entre les deux cas? Ou est-ce que je ne comprends pas quelque chose (peut-être quelque chose à propos de <> utilisé lors du casting?)

EDIT puisque la question est marquée comme dupliquée, je suis conscient qu'il y a l'autre question sur any [] mais je l'ai quand même regardée avant de poster et pour moi, il s'agissait plus du type 'any' que des différents [] VS < > J'ai demandé


3
Possible duplicate of Typescript Array vs any []
— Nitzan Tomer

1
Ce sont pratiquement les mêmes constructions et ce sont en fait les mêmes objets à l'exécution. Reflect-metadata les traitera également comme ayant l' Arrayobjet comme constructeur. Voir la réponse liée ci-dessus.
— John Weisz

3
@NitzanTomer cette question est obsolète - Array<T>n'existait pas à l'époque.
— Nathan Shively-Sanders

@ NathanShively-Sanders , la réponse est la même avec ou sans les génériques parce que cette question peut être réduite à « ce qui est la différence entre let x: Array;la let x: any[];»
— Nitzan Tomer

Réponses:


168

Il n'y a aucune différence sémantique

Il n'y a aucune différence. Type[]est la syntaxe abrégée d'un tableau de Type. Array<Type>est la syntaxe générique . Ils sont tout à fait équivalents.

Le manuel fournit un exemple ici . Cela équivaut à écrire:

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

Ou:

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

Et voici une citation de quelques notes de version :

Plus précisément, number[]est une version abrégée de Array<number>, tout comme Date[]un raccourci pour Array<Date>.

Cependant, il existe un cas où la syntaxe abrégée est requise

Depuis TypeScript 3.4, il existe une différence pour le nouveau readonlymodificateur de type. En effet:

le readonlymodificateur de type ne peut être utilisé que pour la syntaxe des types de tableau et des types de tuple

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

Cependant, la déclaration suivante équivaut à readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, c'est un type générique. Lisez simplement la section "Hello World of Generics" dans le manuel .
— Paleo

4
Il n'y a pas de recommandation officielle. J'utilise personnellement le raccourci et uniquement le raccourci ( type[]), car il est plus facile à lire.
— Paleo

2
Ils ne sont plus complètement identiques: typescriptlang.org/docs/handbook/release-notes/…
— DShook

1
Si j'ai bien compris, au readonlycas où ce n'est pas vraiment nécessaire. Si vous préférez une notation longue, vous pouvez l'écrire comme ceci:let err2: ReadonlyArray<boolean>;
— n4nn31355

1
@ n4nn31355 Je pense que oui. J'ai édité pour ajouter cet avis.
— Paleo

-10
foo: Array

signifie que c'est un tableau simple, avec un anytype implicite pour ses membres

foo: string[]

signifie que c'est un tableau de chaînes, c'est-à-dire que TypeScript deviendra fou si vous essayez de pousser autre chose que des chaînes dans ce tableau.


10
La question était Array <string> vs string [], pas Array vs string [];
— Juangui Jordán

C'est étrange, TypeScript ne semble pas me déranger lorsque je passe un tableau de nombres à une méthode avec un paramètre défini commefoo: string[]
— jlewkovich

3
Si vous passez un tableau de nombres, fn ([1,2,3]), cela vous dérange. Si vous passez une variable et que le type n'est pas explicite, laissez a = []; a = [1,2,3]; fn (a), ça ne me dérange pas parce que a est de type any []
— Quentin 2
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.