Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript Array vs any[]

In TypeScript, what is the difference between Array and any[]? Does Array refer to dynamically sized arrays (during compile-time, of course) and any[] refer to statically sized arrays passed as arguments and type-inferred by the compiler? Because currently when I have functions such as:

mergeArrays(arr1 : Array, arr2 : Array); 

When you call this function with static data, TypeScript uses a typed array (type[]).

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

So are there any compile-time differences between the 2? When do I use any[] and when do I use Array? Sometimes defining vars with Array..

var info:Array; 

..show errors like "Cannot convert any[][] to Array" when setting as follows:

info = [[], []]; 
like image 856
Robin Rodricks Avatar asked Apr 07 '13 09:04

Robin Rodricks


People also ask

What is any [] in TypeScript?

Types Array<any> and any[] are identical and both refer to arrays with variable/dynamic size. Typescript 3.0 introduced Tuples, which are like arrays with fixed/static size, but not really.

Is any [] same as any?

Show activity on this post. Difference between any and any[] is in Intellisence. By declaring something any[] , you are telling that I want this object to be of type an array. However, any is literally anything, even array can be any so typescript allows you to assign any to any array.

Is string [] the same as array string?

There's no difference between the two, it's the same. It says this in the docs: Array types can be written in one of two ways.

How do you declare an array of any type in TypeScript?

In TypeScript, an array is an ordered list of values. An array can store a mixed type of values. To declare an array of a specific type, you use the let arr: type[] syntax.


2 Answers

The previous answer to this question has been outdated for a while now.

First of all Array requires a generic parameter:

var arr: Array<any>; 

This is equivalent to:

var arr: any[]; 

Types Array<any> and any[] are identical and both refer to arrays with variable/dynamic size.

Typescript 3.0 introduced Tuples, which are like arrays with fixed/static size, but not really.

Let me explain.

Their syntax looks like this:

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

Typescript will force you to assign an array of that length and with values that have the matching types.
And when you index the array typescript will recognize the type of variable at that index.

It's interesting to note that typescript wont stop you from modifying the size of the Tuple, either by using a function like .push() or by assigning a value to length. So you have to make sure you don't do it by accident.

You can also specify a "rest" type for any extra elements:

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

In which case you can assign more items to the Tuple and the size of the array may change.

Note: You can not assign a normal array to a Tuple.

In case you only specify a rest type, then you get a regular old array.
The following 2 expressions are equivalent:

var arr: [...any[]]; var arr: any[]; 
like image 53
zoran404 Avatar answered Oct 03 '22 19:10

zoran404


Spec section 3.5.4 specifies their relationship:

An array type of the form ElementType[] is equivalent to an object type with the index signature [index: number]: ElementType plus a set of members equivalent to the global interface type Array where all occurrences of the magic _element type are replaced with ElementType.

Not being able to assign [[], []] or [] to Array is a bug.

There is no notion of a "statically-sized" array in TypeScript. They're all talking about the same underlying JavaScript array (which is dynamically sized):

var x = [1, 2]; x.push(3); x[13] = 5; 
like image 36
Ryan Cavanaugh Avatar answered Oct 03 '22 19:10

Ryan Cavanaugh