What is the difference between any and any[ ]?
Asked Answered
F

4

15

What is the difference between any and any[ ]?


Example 1 (working as expected)

name1: any;
name2: any[];
this.name1 = this.name2;

Example 2 (This is also working as expected)

name1: any;
name2: any[];
this.name2 = this.name1;

Why typescript allowing any data type can be access any[] data type. As same as any[] data type can be access any type of data? and Which one is best to use? And If the data type is just an object (not an array) like string or number or object or any, then why any[ ] will be accept that object type without showing any run-time or compile-time error?.


Flow answered 19/5, 2017 at 11:48 Comment(3)
well.. it's either anything or an array of anything (Which is kind of meaningless since anything can also be an array of anything). The any type is typescript way of disabling the type checking for bits of code.Davita
Yes, and this is the only question that you might ever have when using typescriptBalough
i think it's a good question. should be a compile-time error, at least with noImplicitAny. it seems, however, the typescript team are willing to loosen the type strictness to support existing code. to the detriment of the language IMHO.Hydranth
S
10

If we look at this TypeScript code:

let name1: any = "John";
let name2: any[] = ["Mary", "Sue", "Sally"];
name1 = name2;

let name3: any[] = ["Luke", "Paul", "Ringo"];
let name4: any = "Mark";
name3 = name4;

The Javascript that it compiles to is:

var name1 = "John";
var name2 = ["Mary", "Sue", "Sally"];
name1 = name2;
var name3 = ["Luke", "Paul", "Ringo"];
var name4 = "Mark";
name3 = name4;

JavaScript variables are dynamic and don't have a set type. I can imagine that this could be reported as a warning or error by the TypeScript compiler, but that does not stop the generation of the JavaScript or prevent the JavaScript from running.

So while there is no current compile errors or warnings for any/any[] assignments, any[] can still be used to inform the developer of expectations.

Note: This is not code I would ever write or suggest that any would ever use. This is just the OPs code with values and showing what the resulting JavaScript would be and that because it compiles to JavaScript, there can be no run-time errors due to type because variables have dynamic type. This is one of the reasons we choose to use TypeScript: compile time static type checking. For this reason, one would normally avoid any and any[] in favor of a class or interface that better represents the data. And in this case, string vs. string[] (or any other type) will show a compiler error.

In this example, both of the name1 = name2 and name3 = name4 are compile time errors as the variables infer the type from the assignment and their usage is type-checked in subsequent code.

let name1 = "John";
let name2 = ["Mary", "Sue", "Sally"];
name1 = name2; //Type 'string[]' is not assignable to type 'string'.

let name3 = ["Luke", "Paul", "Ringo"];
let name4 = "Mark";
name3 = name4; //Type 'string' is not assignable to type 'string[]'.
Scarbrough answered 19/5, 2017 at 12:34 Comment(1)
Well stated. A nice answer.Melton
K
6

If you use any, both on the left and on the right side of an assignment, you are basically say to Typescript not use type checking.

In any is on left side it means the the variable you want to assign the value can accept any type, and therefore it accepts anything including an object of type any[].

If the type any is on the right side and you have myVar: any[] on the left side, you are basically say to Typescript not use type checking. Considering that type checking is not applied at run time, you would end up with myVar being filled with whatever you may have on the right side of the assignment.

Kimura answered 19/5, 2017 at 11:59 Comment(2)
yeah ! but my very humble question is . If the data is not an array its just a object, then why any[ ] will be accept that type? at least it should throw an run time error? but not, Why?Flow
@RameshRajendran since it compiles to Javascript, how would you expect a runtime error (variables don't have a static type)?Scarbrough
L
1

Difference between any and any[] is in Intellisence.

var a:any = .....

a.map , a.join (no intellisense, typescript does not know if a is an array or not)


var a:any[] = ....
a.map , a.join (typescript knows that a is an array and will provide intellisence)

Compile time errors

var aa:any[] = "a"; // error typescript will not allow this

var a:any = "a"; // a can be string, there is no harm

aa = a; // typescript cannot detect error at 
        // compile time because a can be array

var someString:string;

aa = someString; // typescript knows that aa is an array and someString is not

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.

TypeScript will detect compile time errors whenever it could, but when you set something to any, it will not detect compile time errors.

It is upto compiler designer to enforce such compile time error or not, I guess following should not be allowed,

 a:any 
 aa:any[] = a; // this should be compile time error

To avoid, one can certainly cast it as aa = a as any[], same as in languages like C# and Java.

Runtime error

JavaScript has no type specification for declaration of variable, so JavaScript engine does not have any idea of about type.

Only when you invoke a method or access property, JavaScrip will give you an error..

a:any[] ..

// this will give an error TypeError: .map is not a function
a.map( ()=> ... )

a.length // this is undefined.. any member of any object is
// essentially undefined, there is no type error when you access
// member
Lazo answered 2/10, 2017 at 9:31 Comment(0)
T
1
  1. only Any used for single object of any type.
  2. Any[] is for array of objects with type Any.
Trochanter answered 2/10, 2017 at 9:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.