Array<Type> vs Type[] no TypeScript: 5 erros fatais e como evitá-los

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Array<Type> vs Type[] no TypeScript: a batalha de sintaxes que você precisa vencer

\n\n

Se você já escreveu em TypeScript, com certeza já viu duas maneiras de declarar um array de números:

\n\n
const numbers1: number[] = [1, 2, 3];\nconst numbers2: Array<number> = [1, 2, 3];
\n\n

Ambas as opções funcionam. Ambas compilam. Ambas são TypeScript válido. Então por que tanta discussão em torno delas? Por que essa pergunta no Stack Overflow tem milhares de visualizações? E o principal — como não pisar em armadilhas que quebrarão seu projeto?

\n\n

Vamos entender de uma vez por todas. Sem teoria chata. Apenas o que realmente será útil na prática.

\n\n

Breve introdução: o que é o quê

\n\n

Sintaxe Type[] (Array Literal Syntax)

\n\n

Esta é a forma mais comum de declarar um array em TypeScript. Veio do JavaScript e parece natural:

\n\n
let fruits: string[] = ['apple', 'banana', 'cherry'];\nlet matrix: number[][] = [[1, 2], [3, 4]]; // Array de arrays
\n\n

Curto, legível, intuitivo. Para 90% dos casos, isso é suficiente.

\n\n

Sintaxe Array<Type> (Generic Syntax)

\n\n

Esta é a forma genérica, usando a interface embutida Array<T>:

\n\n
let fruits: Array<string> = ['apple', 'banana', 'cherry'];\nlet matrix: Array<Array<number>> = [[1, 2], [3, 4]];
\n\n

Parece mais "acadêmico", mas oferece mais flexibilidade em cenários complexos.

\n\n

Top 5 erros que até desenvolvedores experientes cometem

\n\n

Erro nº1: Confiança cega no autocomplete da IDE

\n\n

Sua IDE pode sugerir ambas as opções. Mas isso não significa que elas são intercambiáveis em todos os lugares. Veja um exemplo com union-types:

\n\n
// Assim funciona\ntype Status = 'active' | 'inactive';\nconst statuses1: Status[] = ['active', 'inactive'];\n\n// Mas assim — erro de sintaxe!\n// const statuses2: Array<'active' | 'inactive'> = ['active', 'inactive']; \n// ❌ Erro: ';' expected\n\n// Versão correta com genérico:\nconst statuses3: Array<Status> = ['active', 'inactive'];
\n\n

Conclusão: Dentro de Array<> não é possível usar union-types complexos diretamente. Primeiro, declare-os em um tipo separado.

\n\n

Erro nº2: Confusão com arrays readonly

\n\n

Quando você precisa tornar um array imutável, as sintaxes se comportam de forma diferente:

\n\n
// ✅ Correto com Type[]\nconst readonlyFruits: readonly string[] = ['apple', 'banana'];\n// readonlyFruits.push('orange'); // ❌ Erro: readonly\n\n// ❌ Isso não funciona:\n// const wrong: readonly Array<string> = ['apple']; \n// Erro: 'readonly' modifier can only appear on array types\n\n// ✅ Correto com Array<> — use ReadonlyArray:\nconst correct: ReadonlyArray<string> = ['apple', 'banana'];
\n\n

Conclusão: Para arrays readonly, use readonly Type[] ou ReadonlyArray<Type>. Não é possível misturar readonly com Array<>.

\n\n

Erro nº3: Problemas com arrays multinível

\n\n

Quando um array contém outros arrays, a sintaxe Array<> se torna verbosa:

\n\n
// Legível e claro\nconst grid1: number[][] = [[1, 2], [3, 4]];\n\n// Já fica mais difícil de ler\nconst grid2: Array<Array<number>> = [[1, 2], [3, 4]];\n\n// E com três níveis? Um pesadelo:\nconst cube: Array<Array<Array<number>>> = [[[1]]]; // 🤯\n\n// Com Type[] é mais simples:\nconst cube2: number[][][] = [[[1]]];
\n\n

Conclusão: Para arrays com mais de 2 níveis de aninhamento, use Type[][]. Seus colegas agradecerão.

\n\n

Erro nº4: Ignorar o contexto de uso

\n\n

Em alguns frameworks (Angular, React) e bibliotecas, um determinado estilo é adotado. Violar a convenção pode causar confusão:

\n\n
// Angular frequentemente u                

Blogs

Book Recommendations