← Concepts

The `any` type

The any type in TypeScript is a workaround for cases when you don't know what type a value might be. It allows you to assign a variable or function parameter to be of literally any type.

Here's an example of using any in a function argument:

function greet(name: any) {
  console.log(`Hello, ${name}!`);
}

greet("John"); // Outputs: Hello, John!
greet(123); // Outputs: Hello, 123!

any lets you do extremely dangerous things in TypeScript. By marking a variable as any, you're telling the compiler to ignore any type errors that might occur.

const user: any = {
  name: "John",
  age: 30,
};

user.roles.push("admin"); // Runtime error!

In the example above, we're trying to push a new value to the roles array, but the roles property doesn't exist on the user object. This will cause a runtime error, but TypeScript won't warn us about it because we've marked the user variable as any.

any vs unknown

The unknown type is a type-safe counterpart of any, which requires you to perform a type check before using the variable. Unlike any, unknown can help prevent runtime errors by forcing you to narrow down the type of the variable before using it in your code.

Here's an example of using unknown in a function argument:

function greet(name: unknown) {
  if (typeof name === "string") {
    console.log(`Hello, ${name}!`);
  }
}

greet("John"); // Outputs: Hello, John!
greet(123); // No output

Overall, the any type can be useful in situations where you need more flexibility, but it comes with the cost of losing type safety. It's best to use it sparingly and with caution.