DEV Community

Cover image for Why You Should Avoid Using 'any' in TypeScript and How to Do It
Yatin Choudhary
Yatin Choudhary

Posted on

Why You Should Avoid Using 'any' in TypeScript and How to Do It

In TypeScript, 'any' is a special data type that allows a variable to hold any type of value, similar to the 'Object' type in JavaScript. When a variable is declared as 'any', TypeScript's type checker doesn't perform any type checking on it, making it possible to assign values of any type to the variable. While using 'any' can make the code more flexible and easy to write, it can also lead to runtime errors and make the code less maintainable, as it makes it harder to catch type-related errors during development.

let myVariable: any = "Hello World";
console.log(myVariable); // Output: "Hello World"

myVariable = 123;
console.log(myVariable); // Output: 123

myVariable = true;
console.log(myVariable); // Output: true
Enter fullscreen mode Exit fullscreen mode

Using 'any' in TypeScript can provide some benefits in certain scenarios. For eg.

  1. When prototyping an application, using 'any' can make the code more flexible and easy to write. It allows you to quickly build the application without worrying about the data types and allows you to test your code quickly.
  2. When prototyping an application, using 'any' can make the code more flexible and easy to write. It allows you to quickly build the application without worrying about the data types and allows you to test your code quickly.
  3. If you are working with existing code that doesn't have type annotations, using 'any' can help to gradually introduce type safety in your codebase. By starting with 'any' types, you can progressively add type annotations to your code over time, making it more maintainable.

BUT...

Using 'any' in TypeScript should be avoided as much as possible for several reasons

  1. When using 'any', TypeScript's type checker does not perform any type checking on the variable, making it easier to introduce runtime errors. This can make the code less reliable and harder to maintain, especially in larger projects.
  2. When a variable is declared as 'any', it can be difficult to understand what type of data it should hold. This can make the code less readable and harder to understand for other developers working on the project.
  3. When a project grows in size and complexity, using 'any' can make it harder to maintain and debug the code. This is because it's more difficult to catch type-related errors during development, making it harder to identify and fix issues.
  4. TypeScript is designed to use type inference to determine the types of variables based on their values. When a variable is declared as 'any', TypeScript loses the ability to infer the type, making it harder to detect errors and maintain the code.

So how to do it ,

Some well known answers are :

  1. Use more specific types
  2. Use type inference
  3. Use interfaces or types
  4. Use strictNullChecks

And you can also use :

  1. Record types to avoid using 'any' in TypeScript. Record types allow you to define an object type with a specific set of keys and values. For example, instead of using 'any' to represent an object with unknown keys and values, you can define a Record type that specifies the shape of the object:
type MyObject = Record<string, unknown>;

const myObj: MyObject = {
  foo: "bar",
  num: 123,
  bool: true,
  nestedObj: {
    key: "value",
  },
};

console.log(myObj.foo); // Output: "bar"
console.log(myObj.num); // Output: 123
console.log(myObj.bool); // Output: true
console.log(myObj.nestedObj.key); // Output: "value"
Enter fullscreen mode Exit fullscreen mode

2.'Partial' and 'Required' utility types to create a new type with some properties optional and some required.

For example, let's say you have an object type that includes 'any' to allow for flexibility:

type MyObject = {
  name: string;
  age: number;
  address: any;
}
Enter fullscreen mode Exit fullscreen mode

If you want to make the 'address' property optional, you can use the 'Partial' utility type to create a new type with the 'address' property as optional:

type MyPartialObject = Partial<MyObject> & {
  address?: any;
};
Enter fullscreen mode Exit fullscreen mode

Similarly, if you want to make the 'name' property required, you can use the 'Required' utility type to create a new type with the 'name' property required:

type MyRequiredObject = Required<MyObject> & {
  name: string;
};
Enter fullscreen mode Exit fullscreen mode

3.Pick and Omit
'Pick' and 'Omit' utility types can be used to select or remove properties from an object type, respectively.
The 'Pick' type allows you to select specific properties from an object type and create a new type with only those properties. For example, if you have an object type with multiple properties:

type MyObject = {
  name: string;
  age: number;
  email: string;
}
Enter fullscreen mode Exit fullscreen mode

You can create a new type with only the 'name' and 'age' properties using the 'Pick' type:

type MyPickObject = Pick<MyObject, 'name' | 'age'>;
Enter fullscreen mode Exit fullscreen mode

On the other hand, the 'Omit' type allows you to remove specific properties from an object type and create a new type without those properties.

type MyOmitObject = Omit<MyObject, 'email'>;
Enter fullscreen mode Exit fullscreen mode

Thanks for reading...

Top comments (0)