5 Tips for Writing Typescript Code Like a Pro

Are you a new TypeScript developer looking to level up your coding skills? I'll be sharing essential tips to make your transition smoother.

5 Tips for Writing Typescript Code Like a Pro

Welcome to another exciting blog post where we delve into the world of TypeScript and explore some invaluable tips and tricks to enhance the cleanliness and maintainability of your code. TypeScript, with its static typing and advanced features, helps developers write robust and scalable applications. So, let's roll up our sleeves and uncover these 5 TypeScript secrets that will level up your coding game.

Embrace Strong Typing:

I get it, simply typing a variable any is much quicker than writing out type definitions for every variable. But you're losing out on the pros of moving to typescript.

One of the primary advantages of TypeScript is its static typing system. By explicitly defining types for variables, functions, and interfaces, you provide clear documentation for your codebase. This enables better understanding, improves collaboration, and also gives you the perk of awesome intellisense in your IDE. Remember, strong typing everything is your first step towards building maintainable applications.

One thing I found out very late into my typescript journey, is you can generate typings using a sample JSON object using websites like quicktype.

Leverage Union and Intersection Types:

TypeScript offers powerful tools like union and intersection types that allow you to combine multiple types into a single one. Union types (using the | operator) enable you to define variables that can hold different types, offering flexibility without compromising type safety. On the other hand, intersection types (using the & operator) allow you to merge multiple types, creating new ones that possess the combined properties and methods. Utilizing these features smartly can lead to more expressive and reusable code.

Eg. Let's say you have a user object which stores user auth information and a userProfile object that stores user profile data like profile picture, full name, etc. Create individual types for these two and use intersection to create complete user objects. This makes it easy to use user and userProfile objects individually

Unlock the Power of TypeScript Utilities:

TypeScript provides a set of utility types that can greatly simplify your code and make it more maintainable. Two such utilities are Omit and Record. The Omit utility allows you to create a new type by excluding specific properties from an existing type. This is particularly useful when you want to create a variation of an object or interface without certain properties. On the other hand, the Record utility helps you define a new type by mapping keys to specific value types. It's perfect for scenarios where you need to create a dictionary-like structure with predetermined key-value pairs.

By leveraging these utility types, along with others like Partial, Pick, and ReturnType, you can significantly reduce code duplication and increase the reusability of your types. They provide powerful tools to manipulate and transform types, allowing you to write cleaner, more expressive code with fewer errors.

Employ Generics for Reusability:

Generics are a powerful feature in TypeScript that allow you to create reusable components and functions. By parameterizing types, you can write code that operates on a variety of data structures while preserving type safety. Generics enable you to write highly adaptable code that doesn't sacrifice type checking or clarity. Embrace this feature to write cleaner, more concise, and more flexible code.

For example,

class Queue<T> {
  private elements: T[] = [];

  enqueue(item: T): void {
    this.elements.push(item);
  }

  dequeue(): T | undefined {
    return this.elements.shift();
  }
}

const numberQueue = new Queue<number>();
numberQueue.enqueue(10);
numberQueue.enqueue(20);
const firstNumber = numberQueue.dequeue(); // inferred as number

const stringQueue = new Queue<string>();
stringQueue.enqueue("Hello");
stringQueue.enqueue("World");
const firstString = stringQueue.dequeue(); // inferred as string

In this example, the Queue class is defined with a generic type T. This allows the class to create a queue that can hold elements of any type. By leveraging generics, you can create reusable data structures that maintain type safety and adapt to various scenarios effortlessly.

Take Advantage of TypeScript Compiler Flags:

The TypeScript compiler offers a range of flags that can enhance your development experience. By configuring the compiler options, you can enforce stricter rules, catch potential errors early, and optimize the outputted JavaScript code.

For example,

--strict: This flag enables the strictest type-checking rules, ensuring robustness throughout your project.

--noImplicitAny: This flag ensures that TypeScript forces you to explicitly provide type annotations for variables with an implicit any type. It helps catch situations where you might have unintentionally left out type information, promoting more explicit and safer code.

--strictNullChecks: With this flag enabled, TypeScript provides stricter checks for null and undefined values. It helps eliminate potential runtime errors by making you explicitly handle cases where variables can be null or undefined, thereby improving code reliability.

--strictFunctionTypes: Enabling this flag ensures that function types are checked more strictly, including parameter types, return types, and contextual typing. It helps catch common mistakes, such as assigning incompatible functions or callbacks, resulting in better interoperability and avoiding subtle bugs.

Conclusion

Congratulations! You have now unlocked the secrets of TypeScript's cleaner and maintainable code. It can be very annoying coding in typescript when you've just switched from Javascript. But as the codebase gets larger and larger, you'll start appreciating typescript and its perks more and more.

Thank concludes this blog. If you want to learn more about FullStack Development / Blockchain Development, you can follow my socials to stay updated.

Twitter - twitter.com/sarat_angajala

Linkedin - linkedin.com/in/saratangajala

Github - github.com/in/SaratAngajalaoffl

Did you find this article valuable?

Support Sarat Angajala by becoming a sponsor. Any amount is appreciated!