TypeScript Utility Types: Pick, Omit, Partial, Record (Practical Guide)

A deep, interview-ready guide to TypeScript utility types: Pick/Omit/Partial/Required/Readonly/Record, common patterns, and how to avoid over-complicating types.

F

Frontend Interview Team

February 08, 2026

~22 min
TypeScript Utility Types: Pick, Omit, Partial, Record (Practical Guide)

Utility types help you reuse and transform types without duplicating definitions.

Interviews like these because they show you can keep types DRY and accurate.


1) Pick

Pick selects a subset of properties.

type User = { id: string; email: string; name: string };
 
type UserPreview = Pick<User, 'id' | 'name'>;

Use case:

  • list views that only need a subset

2) Omit

Omit removes properties.

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

Use case:

  • removing sensitive fields for public APIs

3) Partial / Required

type PatchUser = Partial<User>; // all optional
 
type FullUser = Required<Partial<User>>; // all required again

Use cases:

  • PATCH endpoints: Partial
  • internal “complete” objects: Required

4) Readonly

type ReadonlyUser = Readonly<User>;

Use case:

  • preventing accidental mutation

5) Record

Record defines an object with specific key and value types.

type Role = 'admin' | 'user';
 
type RoleLabels = Record<Role, string>;
 
const labels: RoleLabels = {
  admin: 'Admin',
  user: 'User'
};

Use case:

  • mapping known keys to values

6) Interview patterns

Pattern A: API DTO types

type UserDTO = Pick<User, 'id' | 'email'>;

Pattern B: Form types

type UserForm = Omit<User, 'id'>;

Pattern C: Updates

type UpdateUser = Partial<Omit<User, 'id'>>;

7) Avoid over-typing

Don’t create 10 layers of utility types if it becomes unreadable.

If a type is too complex, consider:

  • explicit type alias for clarity
  • validation schemas (Zod)

Summary

  • Pick/Omit reshape existing types.
  • Partial/Required control optionality.
  • Record is perfect for key-value maps.
  • Keep utility type usage readable.