DEV Community

Cover image for React with TypeScript: 10 Pro Tips to Supercharge Your Code
Ryan Aulia
Ryan Aulia

Posted on • Updated on • Originally published at aulianza.id

React with TypeScript: 10 Pro Tips to Supercharge Your Code

React and TypeScript are a powerful combination for building robust and scalable web applications. While React provides a flexible and efficient UI development framework, TypeScript adds static typing and enhances the development experience. In this article, we will explore ten essential tips that can help beginners improve their React TypeScript code. Each tip will be accompanied by a code example and a detailed explanation to ensure a clear understanding. Let's dive in!

1. Define PropTypes with TypeScript's type annotations

When using React with TypeScript, we can leverage type annotations to define prop types. This improves code readability, catches potential bugs, and enhances the development experience. Instead of using the PropTypes library, we can declare prop types directly in the component's interface or type definition. Here's an example:

interface MyComponentProps {
  name: string;
  age: number;
}

const MyComponent: React.FC<MyComponentProps> = ({ name, age }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

2. Utilize React.FC for functional components

The React.FC type is a generic type provided by TypeScript that includes default prop types and children. Using it for functional components allows us to access these properties without explicitly defining them. Here's an example:

interface MyComponentProps {
  name: string;
}

const MyComponent: React.FC<MyComponentProps> = ({ name, children }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

3. Leverage TypeScript's Enum for improved type safety

Enums in TypeScript are a great way to define a set of named values. Utilizing enums in React TypeScript code enhances type safety by restricting the possible values for certain props or variables. Here's an example:

enum ButtonSize {
  SMALL = 'small',
  MEDIUM = 'medium',
  LARGE = 'large',
}

interface ButtonProps {
  size: ButtonSize;
}

const Button: React.FC<ButtonProps> = ({ size }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

4. Use TypeScript's Union Types for flexible prop values

Union Types in TypeScript allow us to specify that a prop can have multiple accepted types. This flexibility is particularly useful when a component prop can accept different data types. Here's an example:

interface MessageProps {
  text: string | number;
}

const Message: React.FC<MessageProps> = ({ text }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

5. Take advantage of React's useRef with TypeScript

React's useRef hook is commonly used to reference DOM elements or store mutable values. When using useRef with TypeScript, we can specify the type of the referenced value, reducing the chances of type errors. Here's an example:

const MyComponent: React.FC = () => {
  const inputRef = useRef<HTMLInputElement>(null);

  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

6. Use TypeScript's Partial type for optional props

In React components, some props may be optional, meaning they don't have to be provided by the parent component. TypeScript's Partial type allows us to define props that are not required. Here's an example:

interface MyComponentProps {
  name: string;
  age?: number;
}

const MyComponent: React.FC<MyComponentProps> = ({ name, age }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

7. Apply TypeScript's Non-Nullable type for stricter null checks

In TypeScript, the Non-Nullable type can be used to ensure that a variable or prop is not null or undefined. This helps catch potential errors caused by null values. Here's an example:

interface MyComponentProps {
  name: string;
  age: number | null;
}

const MyComponent: React.FC<MyComponentProps> = ({ name, age }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

8. Utilize TypeScript's Omit or Pick for prop manipulation

TypeScript provides the Omit and Pick utility types for manipulating existing types. Omit allows us to exclude specific properties, while Pick allows us to select specific properties from a type. Here are examples of each:

interface OriginalProps {
  name: string;
  age: number;
  email: string;
}

type ModifiedProps = Omit<OriginalProps, 'age'>; // Excluding the 'age' property

type NewProps = Pick<OriginalProps, 'name'>; // Selecting only the 'name' property

Enter fullscreen mode Exit fullscreen mode

9. Leverage TypeScript's Readonly modifier for immutability

To enforce immutability, TypeScript provides the Readonly modifier, which makes object properties read-only. This can prevent accidental modification of props or state within a component. Here's an example:

interface MyComponentProps {
  readonly name: string;
  readonly age: number;
}

const MyComponent: React.FC<MyComponentProps> = ({ name, age }) => {
  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

10. Use TypeScript's Type Assertions for more flexibility

TypeScript's Type Assertions allow us to override the inferred type and provide a specific type for a variable or prop. While type assertions should be used with caution, they can be useful in certain scenarios. Here's an example:

interface MyComponentProps {
  name: string;
}

const MyComponent: React.FC = ({ name }: MyComponentProps) => {
  const length = (name as string).length; // Type assertion to ensure name is treated as a string

  // Component implementation
};

Enter fullscreen mode Exit fullscreen mode

These ten tips provide beginner React TypeScript developers with valuable insights to enhance their code quality and development experience. By leveraging TypeScript's static typing and advanced features, we can write more robust and maintainable React applications. Incorporate these tips into your projects and witness immediate improvements in your code. Happy coding!

Top comments (6)

Collapse
 
luisgregson profile image
Luis Gregson

Great article. Thanks for posting.
One thing to note: React.FC is not advised for use anymore.

Your examples are quite easy to convert to the recommended format though:

const MyComponent: React.FC = ({ name }: MyComponentProps) => {
  // Component implementation
};
Enter fullscreen mode Exit fullscreen mode
Collapse
 
aulianza profile image
Ryan Aulia

Thank you for your comment! I appreciate your feedback.

Collapse
 
aulianza profile image
Ryan Aulia

Hi, kindly leave a like and comment if you got something to ask! 🔥

Collapse
 
solomonjude8 profile image
Solomon Jude

Hello Ryan Aulia, you are welcome to dev.to community. Hope to see more of your content!. 😊😊

Collapse
 
lalami profile image
Salah Eddine Lalami

Thanks ,
here starter react.js with typescript project : github.com/idurar/starter-react-re...

starter react.js with typescript project

Collapse
 
chiemelie profile image
Chiemelie

Nice one!