TypeScript: создание пустого типизированного контейнера

185

Я создаю простую логическую игру под названием «Три из преступления» в TypeScript.

При попытке предварительно выделить типизированный массив в TypeScript я попытался сделать что-то вроде этого:

var arr = Criminal[];

который выдал ошибку "Проверьте формат выражения".

также пытался сделать это

var arr : Criminal = [];

и это произвело "не может преобразовать ни одного [] в" уголовное "

что такое «TypeScript» способ сделать это?

darethas
источник

Ответы:

169

В существующих ответах пропущена опция, поэтому вот полный список:

// 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. Явное указание типа является общим решением для случаев, когда вывод типа завершается неудачно для объявления переменной.

  2. Преимущество использования утверждения типа (иногда называемого приведением, но на самом деле это не приведение в TypeScript) работает для любого выражения, поэтому его можно использовать, даже если переменная не объявлена. Существует два синтаксиса для утверждений типа, но только последний будет работать в сочетании с JSX, если вы заботитесь об этом.

  3. Использование конструктора Array поможет вам только в этом конкретном случае, но лично я считаю его наиболее читабельным. Тем не менее, во время выполнения наблюдается небольшое влияние на производительность *. Кроме того, если кто-то достаточно сумасшедший, чтобы переопределить конструктор Array, значение может измениться .

Это вопрос личных предпочтений, но я считаю третий вариант наиболее читабельным. В подавляющем большинстве случаев упомянутые недостатки будут незначительными, и читабельность является наиболее важным фактором.

*: Забавный факт; на момент написания статьи разница в производительности в Chrome составляла 60%, тогда как в Firefox различий в производительности не было.

Торарин
источник
60% ?? : O Это дико
Макс Коплан
239

Вопрос о правильном предварительном размещении типизированного массива в TypeScript был несколько скрыт из-за синтаксиса литерала массива, поэтому он не был таким интуитивно понятным, как я сначала подумал.

Правильный путь будет

var arr : Criminal[] = [];

Это даст вам правильно типизированный пустой массив, хранящийся в переменной 'arr'

Надеюсь, что это помогает другим!

darethas
источник
20

Я знаю, что это старый вопрос, но недавно я столкнулся с аналогичной проблемой, которая не может быть решена таким образом, так как мне пришлось возвращать пустой массив определенного типа.

я имел

return [];

где []был Criminal[]тип.

Ни то, return: Criminal[] [];ни другоеreturn []: Criminal[]; у меня, у меня не получалось.

На первый взгляд, я решил эту проблему, создав типизированную переменную (как вы правильно сообщили) непосредственно перед ее возвратом, но (я не знаю, как работают движки JavaScript) это может привести к накладным расходам и стать менее читабельным.

Для полноты я также сообщу об этом решении в своем ответе:

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

В конце концов я нашел приведение типа TypeScript, которое позволило мне решить проблему более кратким и читабельным (и, возможно, эффективным) способом:

return <Criminal[]>[];

Надеюсь, это поможет будущим читателям!

Fylax
источник
1

Для публичного доступа используйте как ниже:

public arr: Criminal[] = [];
rk13
источник