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

Typescript Array vs any []

В TypeScript, в чем разница между Array и any[]? Является ли массив ссылкой на массивы с динамическим размером (во время компиляции, разумеется) и any[] ссылаться на массивы статического размера, переданные в качестве аргументов и вводимые типами компилятором? Поскольку в настоящее время у меня есть такие функции, как:

mergeArrays(arr1 : Array, arr2 : Array);

Когда вы вызываете эту функцию со статическими данными, TypeScript использует типизированный массив (type[]).

mergeArrays([true, false],  [1, 2]);
//          bool[]          number[]

Итак, существуют ли какие-либо различия во времени компиляции между двумя? Когда я использую any[] и когда я использую Array? Иногда определяется vars с Array..

var info:Array;

.. показывать ошибки типа "Невозможно преобразовать любой [] [] в массив" при настройке следующим образом:

info = [[], []];
4b9b3361

Ответ 1

Раздел 3.5.4 Spec определяет их взаимосвязь:

Тип массива формы ElementType[] эквивалентен типу объекта с сигнатурой индекса [index: number]: ElementType плюс набор членов, эквивалентный типу глобального интерфейса Array, где все вхождения магического типа _element заменен на ElementType.

Невозможность назначить [[], []] или [] на Array является ошибкой.

В TypeScript нет понятия массива "статического размера". Все они говорят о том же базовом массиве JavaScript (который имеет динамический размер):

var x = [1, 2];
x.push(3);
x[13] = 5;

Ответ 2

Предыдущий ответ на этот вопрос уже давно устарел.

Прежде всего, для Array требуется общий параметр:

var arr: Array<any>;

Это эквивалентно:

var arr: any[];

Типы Array<any> и any[] идентичны и относятся к массивам с переменным/динамическим размером.

В Typescript 3.0 представлены кортежи, которые похожи на массивы с фиксированным/статическим размером, но не совсем.

Позволь мне объяснить.

Их синтаксис выглядит так:

var arr: [any];
var arr: [any, any];
var arr: [any, any, any];
var arr: [string, number, string?, MyType];

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

Интересно отметить, что машинописный текст не остановит вас от изменения размера кортежа, используя функцию наподобие .push() или назначив значение для length. Таким образом, вы должны убедиться, что вы не делаете это случайно.

Вы также можете указать тип отдыха для любых дополнительных элементов:

var arr: [any, any, ...any[]];
var arr: [string, number, string?, MyType, ...YourType[]];

В этом случае вы можете назначить больше элементов в кортеж, и размер массива может измениться.

Примечание. Нельзя назначить обычный массив для кортежа.

Если вы укажете только тип отдыха, вы получите обычный старый массив.
Следующие 2 выражения эквивалентны:

var arr: [...any[]];
var arr: any[];