DEV Community

Sharoz Tanveer🚀
Sharoz Tanveer🚀

Posted on

Understanding 'any', 'unknown', and 'never' in TypeScript

TypeScript offers a robust type system, but certain types can be confusing, namely any, unknown, and never. Let's break them down for better understanding.

The any Type

The any type is the simplest of the three. It essentially disables type checking, allowing a variable to hold any type of value. For example:

let value: any;
value = 42;             // number
value = "Hello";        // string
value = [1, 2, 3];      // array
value = () => {};       // function
value = { key: "val" }; // object
value = new Date();     // date
Enter fullscreen mode Exit fullscreen mode

In all these cases, TypeScript does not raise any errors, allowing us to perform any operation on the variable without type constraints. This can be useful when migrating a JavaScript project to TypeScript. However, relying on any negates the benefits of type safety, making it a poor choice in most cases. Instead, consider using unknown.

The unknown Type

The unknown type is safer than any because it requires type checks before performing operations. It represents the set of all possible values, but with type safety enforced.

let value: unknown;
value = 42;
value = "Hello";

// To perform operations, we need to narrow down the type
if (typeof value === "number") {
  console.log(value + 1); // TypeScript knows value is a number here
}

Enter fullscreen mode Exit fullscreen mode

Using unknown is beneficial for functions that accept any type of input, like logging functions, as it enforces type checks before proceeding with operations.

The never Type

The never type represents the empty set of values, indicating that something should never occur. No value can be assigned to a never type, making it useful for exhaustive checks and representing unreachable code.

type User = { type: "admin" } | { type: "standard" };

function handleUser(user: User) {
  switch (user.type) {
    case "admin":
      // handle admin
      break;
    case "standard":
      // handle standard
      break;
    default:
      const _exhaustiveCheck: never = user;
      // This ensures all cases are handled
  }
}

Enter fullscreen mode Exit fullscreen mode

If a new user type is added, TypeScript will raise an error, ensuring that all cases are addressed, making never invaluable for maintaining exhaustive checks in your code.

Conclusion

Understanding any, unknown, and never enhances TypeScript's type safety. Use any sparingly, preferring unknown for safer type checks, and leverage never for exhaustive checks and unreachable code. These types, when used correctly, make TypeScript a powerful tool for building reliable applications.
Happy coding!

Top comments (0)