Deep Dive into TypeScript Utility Types: `Omit`, `Exclude`, `Extract`, `NonNullable`, `Parameters`

posted 2 min read

TypeScript’s utility types give you powerful ways to transform and manipulate existing types. If you’ve already used types like Partial or Pick, it’s time to expand your toolbox.

In this article, we'll focus on five highly useful utility types:

  • Omit<Type, Keys>
  • Exclude<UnionType, ExcludedMembers>
  • Extract<UnionType, IncludedMembers>
  • NonNullable<Type>
  • Parameters<Type>

1. Omit<Type, Keys>

Omit creates a new type by removing specified keys from another type.

Example

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

type UserWithoutEmail = Omit<User, 'email'>;

// Result:
type UserWithoutEmail = {
  id: number;
  name: string;
}

Use Case

Perfect when you need to reuse most of a type but exclude a few fields—for example, when hiding sensitive information.


2. Exclude<UnionType, ExcludedMembers>

Exclude removes members of a union that are assignable to another type.

Example

type Roles = 'admin' | 'user' | 'guest';

type NonGuest = Exclude<Roles, 'guest'>;
// Result: 'admin' | 'user'

Use Case

Useful when you want to filter out specific options from a union.


3. Extract<UnionType, IncludedMembers>

Extract is the opposite of Exclude. It keeps only the members that are assignable to another type.

Example

type Events = 'click' | 'hover' | 'scroll';

type UIEvents = Extract<Events, 'click' | 'hover'>;
// Result: 'click' | 'hover'

Use Case

Helpful when you want to narrow a union type to only valid choices.


4. NonNullable<Type>

NonNullable removes null and undefined from a type.

Example

type MaybeUser = User | null | undefined;

type DefinedUser = NonNullable<MaybeUser>;
// Result: User

Use Case

Great when you want to ensure a type is fully usable, for example, after a null-check.


5. Parameters<Type>

Parameters extracts the tuple of parameter types from a function type.

Example

function createUser(id: number, name: string): User {
  return { id, name };
}

type Args = Parameters<typeof createUser>;
// Result: [id: number, name: string]

Use Case

Useful for reusing or forwarding function arguments dynamically.


Summary Table

Utility Type What It Does
Omit<T, K> Removes keys K from type T
Exclude<T, U> Removes members of union T that are assignable to U
Extract<T, U> Keeps only members of union T that are assignable to U
NonNullable<T> Removes null and undefined from type T
Parameters<T> Extracts argument types of function T as a tuple

Wrapping Up

These utility types are essential when writing scalable TypeScript code. They allow you to:

  • Create flexible APIs
  • Simplify code reuse
  • Ensure type safety in transformations

By mastering them, you'll write more expressive and maintainable code.


If you read this far, tweet to the author to show them you care. Tweet a Thanks

Thanks for breaking down these utility types so clearly! They really help simplify complex typings. Which of these do you find yourself using the most in real projects?

Thanks for the utility type-wise breakdown, really helpful!

Appreciate the type-based breakdown, Sunny — super useful!

More Posts

How to set up TypeScript with Node.js and Express (2025)

Sunny - Jun 6

TypeScript vs Zod

Sunny - May 29

Express and TypeScript: How to Set Up Your Project

Mubaraq Yusuf - May 26

Connect a Solana wallet in Next.js to start building dApps effortlessly.

adewumi israel - Jan 24

Setting Up Next.js Authentication with Supabase: A Complete Guide

Anuj Kumar Sharma - Jan 22
chevron_left