Array <Type> VS Type [] en Typecript


162

Hasta donde yo sé, el tipo de una propiedad se puede definir de dos maneras cuando se trata de una matriz.

property_name: type

donde type puede ser

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

y

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

¿Cuál es la diferencia entre los dos casos? ¿O estoy malinterpretando algo (tal vez algo sobre <> utilizado en el casting?)

EDITAR ya que la pregunta está marcada como duplicada, soy consciente de que hay otra pregunta sobre cualquier [], pero aún así la miré antes de publicarla y para mí fue más sobre el tipo 'cualquiera' que el diferente [] VS < > Pregunté


3
Posible duplicado de la matriz
— Nitzan Tomer

1
Son prácticamente las mismas construcciones, y son efectivamente los mismos objetos en tiempo de ejecución. Reflect-metadata también los tratará a ambos como si tuvieran el Arrayobjeto como su constructor. Ver la respuesta vinculada anterior.
— John Weisz

3
@NitzanTomer esa pregunta está desactualizada, Array<T>no existía en ese entonces.
— Nathan Shively-Sanders

@ NathanShively-Sanders, la respuesta es la misma con o sin los genéricos debido a esta pregunta puede ser reducido a "¿cuál es la diferencia entre let x: Array;a let x: any[];"
— Nitzan Tomer

Respuestas:


168

No hay ninguna diferencia semántica

No hay diferencia en absoluto. Type[]es la sintaxis abreviada de una matriz de Type. Array<Type>es la sintaxis genérica . Son completamente equivalentes.

El manual proporciona un ejemplo aquí . Es equivalente a escribir:

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

O:

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

Y aquí hay una cita de algunas notas de lanzamiento :

Específicamente, number[]es una versión abreviada de Array<number>, tal como Date[]es una abreviatura de Array<Date>.

Sin embargo, hay un caso en el que se requiere la sintaxis abreviada

Desde TypeScript 3.4, hay una diferencia para el nuevo readonlymodificador de tipo. En efecto:

el readonlymodificador de tipo solo se puede usar para sintaxis en tipos de matriz y tipos de tupla

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

Sin embargo, la siguiente declaración es equivalente a readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, es un tipo genérico. Simplemente lea la sección "Hola mundo de genéricos" en el Manual .
— Paleo

44
No hay una recomendación oficial. Yo personalmente uso la taquigrafía y solo la taquigrafía ( type[]), porque es más fácil de leer.
— Paleo

2
Ya no son completamente idénticos: typescriptlang.org/docs/handbook/release-notes/…
— DShook el

1
Si lo hice bien, en readonlycaso de que no sea realmente necesario. Si prefiere una notación larga, puede escribirla así:let err2: ReadonlyArray<boolean>;
— n4nn31355

1
@ n4nn31355 Creo que sí. Edité para agregar este aviso.
— Paleo

-10
foo: Array

significa que es una matriz simple, con un anytipo implícito para sus miembros

foo: string[]

significa que es una matriz de cadenas, es decir, TypeScript se volverá mental si intentas insertar algo que no sean cadenas en esa matriz.


10
La pregunta era Array <string> vs string [], no Array vs string [];
— Juangui Jordán

Es extraño, a TypeScript no parece importarle cuando paso una matriz de números a un método con un parámetro definido comofoo: string[]
— jlewkovich el

3
Si pasa una serie de números, fn ([1,2,3]), entonces le importa. Si pasa una variable y el tipo no es explícito, deje a = []; a = [1,2,3]; fn (a), entonces no le importa porque a es type any []
— Quentin 2
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.