TypeScript: Criando uma matriz de contêineres com tipo vazio

184

Estou criando um jogo de lógica simples chamado "Três de um Crime" no TypeScript.

Ao tentar pré-alocar o tipo de matriz digitada no TypeScript, tentei fazer algo assim:

var arr = Criminal[];

que deu o erro "Verificar formato do termo da expressão".

também tentei fazer isso

var arr : Criminal = [];

e isso produzido "não pode converter nenhum [] em 'Criminal'

qual é a maneira 'TypeScript' de fazer isso?

darethas
fonte

Respostas:

168

As respostas existentes perderam uma opção, então aqui está uma lista completa:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Especificar explicitamente o tipo é a solução geral para sempre que a inferência de tipo falhar em uma declaração de variável.

  2. A vantagem de usar uma asserção de tipo (às vezes chamada de conversão, mas não é realmente uma conversão no TypeScript) funciona para qualquer expressão; portanto, pode ser usada mesmo quando nenhuma variável é declarada. Existem duas sintaxes para asserções de tipo, mas somente as últimas funcionarão em combinação com JSX se você se importar com isso.

  3. Usar o construtor Array é algo que apenas o ajudará nesse caso de uso específico, mas que eu pessoalmente acho mais legível. No entanto, há um leve impacto no desempenho no tempo de execução *. Além disso, se alguém fosse louco o suficiente para redefinir o construtor Array, o significado poderia mudar .

É uma questão de preferência pessoal, mas acho a terceira opção a mais legível. Na grande maioria dos casos, as desvantagens mencionadas seriam insignificantes e a legibilidade é o fator mais importante.

*: Fato engraçado; no momento da redação, a diferença de desempenho era de 60% no Chrome, enquanto no Firefox não havia diferença de desempenho mensurável.

Thorarin
fonte
60% ?? : O que é selvagem
Max Coplan
239

O problema de pré-alocar corretamente uma matriz digitada no TypeScript foi um pouco obscurecido devido à sintaxe literal da matriz, portanto não foi tão intuitivo quanto eu pensava.

A maneira correta seria

var arr : Criminal[] = [];

Isso fornecerá um array vazio, digitado corretamente, armazenado na variável 'arr'

Espero que isso ajude os outros!

darethas
fonte
20

Sei que essa é uma pergunta antiga, mas recentemente enfrentei um problema semelhante que não pôde ser resolvido dessa maneira, pois tive que retornar uma matriz vazia de um tipo específico.

eu tinha

return [];

onde []estavaCriminal[] tipo.

Nem return: Criminal[] [];nemreturn []: Criminal[]; trabalhou para mim.

À primeira vista, resolvi criar uma variável digitada (como você relatou corretamente) antes de retorná-la, mas (não sei como os mecanismos JavaScript funcionam) ela pode gerar sobrecarga e é menos legível.

Para mais detalhes, também relatarei esta solução em minha resposta:

let temp: Criminal[] = [];
return temp;

Eventualmente, encontrei a conversão de tipo TypeScript, o que me permitiu resolver o problema de uma maneira mais concisa e legível (e talvez eficiente):

return <Criminal[]>[];

Espero que isso ajude futuros leitores!

Fylax
fonte
1

Para acesso público, use como abaixo:

public arr: Criminal[] = [];
rk13
fonte