TypeScript: создание пустого массива контейнеров
Я создаю простую логическую игру под названием "Три преступления" в TypeScript.
При попытке предварительно выделить типизированный массив в TypeScript, я попытался сделать что-то вроде этого:
var arr = Criminal[];
который дал ошибку "Проверьте формат выражения выражения".
также пытался сделать это
var arr : Criminal = [];
и это произвело "не может превратить любой [] в" Преступление "
Каков способ 'TypeScript' для этого?
Ответы
Ответ 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[]>[];
Надеюсь, это поможет будущим читателям!