A variable of the any type can be any value. It's an "escape hatch" that brings us back to dynamically typed JavaScript. The any type should generally be avoided.
A value with the any type can be assigned to any variable, regardless of that variable's type.
const myNum: any = 11;const myStr: string = myNum;console.log(myStr); // 11
Here is another example:
const user: any = { name: 'Joseph' };const numbers: number[] = user;console.log(numbers); // { name: 'Joseph' }
Neither of these examples throw a type error even though we are assigning values to variables with the incorrect type. This defeats the very purpose of TypeScript and can lead to bugs down line.
So what do we do when we encounter the any type in the wild?
For example, we could be using a third party library. Imagine we have a function that tells us whether or not a user is active. Because the library is poorly typed the function returns true or false with the any type.
function isUserActive(): any { return true;}
We can use a type guard and conditional narrowing to bring the value back into the land of static types.
function checkStatusType(status: any): boolean { if (typeof status === 'boolean') { return status; } else { throw new Error(`${status} is a ${typeof status}, not a boolean`); }}
We use typeof to check type of the argument and throw an error when the function is passed a value that is not the type we expect it to return (in our case, a boolean).
Let's test this by assigning a string value to a variable with the any type, and pass it to our type guard function.
const userStatus: any = 'true';const checkedUserStatus: boolean = checkStatusType(userStatus);console.log(checkedUserStatus) // Error: false is a string, not a boolean
Now let's try this again, with the function from the third party library that returns true or false as the any type.
const userStatus: any = isUserActive();const checkedUserStatus: boolean = checkStatusType(userStatus);console.log(checkedUserStatus) // true
It works. We now have the correct type.
Now when we try to assign our checkedUserStatus variable to a variable with a different type, we get a type error.
const storeUserStatus: string = checkedUserStatus;// Type 'boolean' is not assignable to type 'string'.
