Подтвердить что ты не робот

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

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

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

var arr = Criminal[];

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

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

var arr : Criminal = [];

и это произвело "не может превратить любой [] в" Преступление "

Каков способ 'TypeScript' для этого?

4b9b3361

Ответ 1

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

Правильный способ:

var arr : Criminal[] = [];

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

У меня был

return [];

где [] был Criminal[].

Ни для меня, ни для return: Criminal[] [];, ни для return []: Criminal[];.

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

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

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

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

return <Criminal[]>[];

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