DEV Community

Cover image for TypeScript Utility Types Every React Developer Should Know
Ishan Bagchi for Byte-Sized News

Posted on • Originally published at Medium

TypeScript Utility Types Every React Developer Should Know

As React developers, we've all been in those moments where managing props, state, or any dynamic data structures becomes slightly... "messy." Enter TypeScript utility types—your productivity's unsung heroes! They’re the Swiss Army knife of TypeScript, designed to make our lives easier by enabling powerful transformations on existing types. Let me show you how these utilities can make your React code cleaner, safer, and, yes, more enjoyable to write.

1. Partial: Make Everything Optional

Picture this: You’re building a component, and you’d like to create a draft version of its props object where not all fields are required. Partial has your back.

interface ButtonProps {
  label: string;
  onClick: () => void;
  disabled?: boolean;
}

const draftButtonProps: Partial<ButtonProps> = {
  label: "Submit",
};
Enter fullscreen mode Exit fullscreen mode

By wrapping ButtonProps with Partial, we’ve made all its properties optional. This is particularly useful for scenarios like form initialization, mocking, or default props.


2. Pick: Cherry-Pick What You Need

Sometimes, you’re working with a large type but only care about a subset of its properties. Enter Pick to save the day.

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
}

const UserCard: React.FC<Pick<User, "name" | "email">> = ({ name, email }) => (
  <div>
    <h3>{name}</h3>
    <p>{email}</p>
  </div>
);
Enter fullscreen mode Exit fullscreen mode

Here, we created a component that only needs the name and email fields from the User interface. This keeps our prop definitions clean and avoids unnecessary data leakage.


3. Omit: Exclude What You Don’t Need

What if you want the opposite of Pick? Maybe you have a type but need to exclude a specific property. That’s where Omit shines.

interface ModalProps {
  title: string;
  content: string;
  onClose: () => void;
  id: string;
}

const NoIdModal: React.FC<Omit<ModalProps, "id">> = ({ title, content, onClose }) => (
  <div>
    <h2>{title}</h2>
    <p>{content}</p>
    <button onClick={onClose}>Close</button>
  </div>
);
Enter fullscreen mode Exit fullscreen mode

With Omit, we’ve excluded the id property. This utility is super handy when dealing with inherited props where certain fields aren’t relevant for a specific component.


4. Record: A Type-Safe Key-Value Map

Imagine you’re building a theme system, and you need a key-value pair for different color tokens. Record makes this simple and type-safe.

const themeColors: Record<"primary" | "secondary" | "background", string> = {
  primary: "#007bff",
  secondary: "#6c757d",
  background: "#f8f9fa",
};
Enter fullscreen mode Exit fullscreen mode

With Record, you define both the keys and their value types. It’s great for mapping enums or predefined constants.


5. Required: Enforce Every Property

We’ve all had that moment where optional properties suddenly need to become required. That’s where Required steps in.

interface Config {
  apiKey?: string;
  endpoint?: string;
}

const loadConfig = (config: Required<Config>) => {
  // Now you’re guaranteed to have both `apiKey` and `endpoint`.
  console.log(config.apiKey, config.endpoint);
};
Enter fullscreen mode Exit fullscreen mode

Required transforms all optional properties into mandatory ones, ensuring you’ll never miss a critical field.


Final Thoughts

These utility types are more than just tools; they’re the cheat codes to cleaner, more maintainable React code. They reduce boilerplate, minimize type errors, and make your life as a developer a little less stressful.

Next time you find yourself typing out repetitive or verbose type definitions, pause for a moment and ask: Can a utility type simplify this? Chances are, it can.

What’s your favorite TypeScript utility type? Let me know in the comments—or better yet, tweet it out! Let’s share the knowledge and keep our React codebases as elegant as they deserve to be.

Top comments (0)