Matriz <Tipo> VS Tipo [] em TypeScript


162

Tanto quanto sei, o tipo de uma propriedade pode ser definido de duas maneiras quando é uma matriz.

property_name: type

onde o tipo pode ser

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

e

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

Qual é a diferença entre os dois casos? Ou estou entendendo mal algo (talvez algo sobre <> usado no elenco?)

EDIT, uma vez que a pergunta está marcada como duplicada, estou ciente de que existe outra questão sobre qualquer [], mas ainda assim eu a examinei antes de postar e para mim era mais sobre o tipo 'any' do que os diferentes [] VS < > Eu perguntei



1
Eles são praticamente as mesmas construções e são efetivamente os mesmos objetos em tempo de execução. O Reflect-metadata também os tratará como tendo o Arrayobjeto como construtor. Veja a resposta vinculada acima.
31516 John Weisz

3
@NitzanTomer essa pergunta está desatualizada - Array<T>não existia naquela época.
Nathan Shively-Sanders

@ NathanShively-Sanders, a resposta é a mesma com ou sem os genéricos porque esta pergunta pode ser reduzido a "o que é a diferença entre let x: Array;a let x: any[];"
Nitzan Tomer

Respostas:


168

Não há diferença semântica

Não há nenhuma diferença. Type[]é a sintaxe abreviada de uma matriz de Type. Array<Type>é a sintaxe genérica . Eles são completamente equivalentes.

O manual fornece um exemplo aqui . É equivalente a escrever:

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;
}

E aqui está uma citação de algumas notas de versão :

Especificamente, number[]é uma versão abreviada de Array<number>, assim como Date[]é uma abreviação de Array<Date>.

No entanto, há um caso em que a sintaxe abreviada é necessária

Desde o TypeScript 3.4, há uma diferença para o novo readonlymodificador de tipo. De fato:

o readonlymodificador de tipo pode ser usado apenas para sintaxe em tipos de matriz e tipos de tupla

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

No entanto, a seguinte declaração é equivalente a readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, é um tipo genérico. Basta ler a seção "Olá, mundo dos genéricos" no Manual .
Paleo

4
Não há uma recomendação oficial. Eu pessoalmente uso a abreviação e somente a abreviação ( type[]), porque é mais fácil de ler.
Paleo

2
Eles não são mais completamente idênticos: typescriptlang.org/docs/handbook/release-notes/…
DShook

1
Se eu entendi direito, readonlycaso não seja realmente necessário. Se você preferir uma notação longa, pode escrevê-la assim:let err2: ReadonlyArray<boolean>;
n4nn31355

1
@ n4nn31355 Acho que sim. Eu editei para adicionar este aviso.
Paleo

-10
foo: Array

significa que é uma matriz simples, com um anytipo implícito para seus membros

foo: string[]

significa que é uma matriz de seqüências de caracteres, ou seja, o TypeScript ficará mental se você tentar inserir algo diferente de seqüências de caracteres nessa matriz.


10
A questão era Array <string> vs string [], não Array vs string [];
Juangui Jordán

É estranho, não typescript não pareceu se importar quando eu passar uma matriz de números a um método com o parâmetro definido comofoo: string[]
jlewkovich

3
Se você passa uma matriz de números, fn ([1,2,3]), então importa. Se você passar uma variável e o tipo não for explícito, deixe a = []; a = [1,2,3]; fn (a), então não se importa porque a é do tipo any []
Quentin 2
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.