TypeScript: Створення порожнього набраного масиву контейнерів


185

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

Коли я намагався заздалегідь виділити набраний масив у TypeScript, я намагався зробити щось подібне:

var arr = Criminal[];

що дало помилку "Перевірити формат виразного терміна".

також спробував це зробити

var arr : Criminal = [];

і це "не може перетворити жодного [] на" Кримінальний "

який спосіб 'TypeScript' зробити це?

Відповіді:


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'

Сподіваюсь, це допомагає іншим!


20

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

я мав

return [];

де []був Criminal[]тип.

Ні для мене, return: Criminal[] [];ні return []: Criminal[];для мене не працювало.

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

Для детальності я повідомлю про це рішення і у своїй відповіді:

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

Врешті-решт я знайшов кастинг типу TypeScript, який дозволив мені вирішити проблему більш стислим і зрозумілим (і, можливо, ефективним) способом:

return <Criminal[]>[];

Сподіваюся, це допоможе майбутнім читачам!


1

Для публічного доступу використовуйте як нижче:

public arr: Criminal[] = [];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.